1 / 58

Curso Programación en Java

Curso Programación en Java. Tema 6 Herencia y Polimorfismo. GENERALIZACIÓN/ESPECIALIZACIÓN.

joy-bray
Télécharger la présentation

Curso Programación en Java

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. CursoProgramación en Java Tema 6 Herencia y Polimorfismo

  2. GENERALIZACIÓN/ESPECIALIZACIÓN • Una generalización se conoce como una relación es-un, es-un-tipo-de. Es una relación entre clases especializadas de una clase general. Un Vendedor es-un Empleado, una Opera es-un Espectáculo, un Rectángulo es un tipo de Forma. • La generalización es una relación entre una clase general y una clase específica. La clase específica, denominada subclase, hereda de la clase general. Se heredan los atributos y las operaciones. • La clase general agrupa los atributos y los métodos comunes a las clases especializadas. • La generalización se representa con una línea de la clase más específica a la clase más general con un triángulo vacío en el extremo de la línea de la superclase. • Una subclase o clase hija puede ser a su vez clase base de otra lo que produce jerarquías de clases. • En las jerarquías de generalización/especialización, hacia arriba se generaliza. La clase más alta en la jerarquía es la clase más general. la clase base. • La implementación de la generalización en un lenguaje de programación se conoce como herencia.

  3. Cuenta Cuenta corriente Cuenta vivienda Cuenta de valores Registro Registro de pasajero Registro de vuelo pasajero de empresa vuelo compartido vuelo operacional pasajero turista JERARQUÍAS DE GENERALIZACÍON

  4. CONCEPTOS ESENCIALES • La creación de una clase a partir de una existente se denomina derivación. • A la capacidad de definir una clase a partir de otra clase ya existente y de añadirle comportamiento y estado se conoce como extensión de la clase original (Java). • El comportamiento de una clase se puede extender mediante un mecanismo que recibe el nombre de herencia. • class BilleteElectronico extends Billete • { • La clase BilleteElectonico extiende de Billete. Por consiguiente, BilleteElectronico es una subclase de Billete y Billete es la superclase (clase base) de BilleteElectronico. • Al crear un objeto de tipo BilleteElectronico se crea un único objeto que consta del objeto de tipo Billete extendido con los atributos propios de BilleteElectronico. Todos los métodos (no privados) de Billete y de BilleteElectronico se pueden invocar directamente desde el objeto BilleteElectronico. • BilleteElectronico e = new BilleteElectronico("Ignacio", 233, "Madrid", visa); • Todo objeto de la clase BilleteElectronicoes-un objeto de tipo Billete.

  5. HERENCIA • Mediante la propiedad de herencia se permite a los objetos ser construidos a partir de otros objetos. Por ejemplo, un objeto ventana de texto se construye a partir del objeto ventana. • Otra forma de expresar la propiedad de herencia, la capacidad de un objeto para utilizar las estructuras de datos y los métodos de objetos ascendientes o antepasados. • El objetivo final es la reutilización, es decir, reutilizar el código anteriormente desarrollado. • La herencia implica una clase base y una jerarquía de clases que contienen las clases derivadas de la clase base. Las clases derivadas heredan el código de su clase base, añadiendo su propio código especial, incluso cambian aquellos elementos de la clase base que necesita sean diferentes. • La herencia se apoya en el significado de ese concepto en la vida ordinaria. La clases básicas se dividen en subclases. La clase Electrodoméstico se divide en subclase Lavadora, Cocina, Lavavajillas, etc. La jerarquía comparte características comunes; si bien una lavadora tiene características especiales que la diferencian de una cocina. • Las características y comportamiento comunes se definen en la clase base.

  6. TIPOS DE HERENCIA • Hay dos de tipos de herencia: herencia simple y herencia múltiple. • La herencia simple es aquella en la que cada clase hereda de una única clase. • La herencia múltiple es la transmisión de métodos y datos de más de una clase base a la clase derivada. • Por ejemplo, en el contexto de una simulación la clase Concurre ( representa actividades concurrentes ) puede tener dos clase base, la clase Tarea y la clase Dato. • Dos problemas se pueden presentar cuando se diseñan clases con herencia múltiple: • • Colisiones de nombres de diferentes clases base. • • Herencia repetida de una misma clase base. • Las jerarquías de herencia múltiple pueden ser complejas de gestionar. De hecho, no todos los lenguajes OO la implementan. • Java, C# y Smalltalk no implementa la herencia múltiple. Eiffel y C++ admiten herencia simple y múltiple.

  7. HERENCIA MÚLTIPLE Motor - potencia MotorGas - tiempoExplos MotorElectrico - intensidad MotorHíbrido • Esta jerarquía con herencia múltiple presenta el problema de repetición del atributo potencia en la clase • MotorHibrido.

  8. HERENCIA SIMPLE Artículo Audio Altavoz Vídeo Radio Amplificador CD • En esta jerarquía cada clase tiene como máximo una sola superclase. La herencia simple permite que una clase herede las propiedades de su superclase jerárquica.

  9. IMPLEMENTACIÓN DE HERENCIA • En Java la herencia se conoce como derivación o extensión. Se emplea la palabra reservada extends. • Sintaxis : • class Base { ... } • class Derivada extends Base • { • // atributos nuevos de Derivada • // métodos nuevos de Derivada • } • Los miembros privados de la clase base nunca son visibles en la clase derivada. • En la clase derivada se pueden invocar a las versiones originales de los métodos redefinidos utilizando super. • En general, super hace referencia a la porción del objeto Padre que tiene el objeto Hijo.

  10. REGLAS DE ACCESO A LA CLASE BASE • Los miembros públicos de la clase base son también miembros públicos de la clase derivada, los miembros protegidos de la clase base se convierten en protegidos de la clase derivada, y los miembros privados de la clase base no son visibles en la clase derivada. class Cartilla { private String tit; protected double saldo; public void ingresar(double q) { saldo += q; } class Ahorrro extends Cartilla { private int duracion; public void informe() { if (saldo > 0 ...// heredado System.out.println(tit); // error, no visible }

  11. CONSTRUCTOR DE UN OBJETO DERIVADO • La información para construir una parte del objeto derivado reside en la clase base. Por esa razón antes de aplicar el constructor de la clase derivada se aplica el constructor de la clase base. Por ejemplo, al crear un objeto Profesional primero se crea la parte de Persona y, a continuación la parte de Profesional. • Si la clase base fuese, a su vez, derivada de otra clase base, antes de crearse la porción del objeto correspondiente a esta se crearía la parte de su clase base. Y así sucesivamente. • El constructor de una clase debe inicializar sólo los datos que dicha clase añada a la jerarquía. • La inicialización de los datos de la clase base se realiza llamando explícitamente al constructor de la clase base. • En Java, la llamada al constructor de la clase base desde el constructor de la clase derivada se realiza con super() proporcionando los argumentos requeridos por dicho constructor.

  12. OBJETO DERIVADO public class Lampara { private int pot; protected String desr; public Lampara(int pot, String d) { this.pot = pot; desr = d; } // ... public class LamparaGas extends Lampara { private double cd; public LamparaGas(int pt, String ds, double can) { super (pt, ds); cd = can; }

  13. SUSTITUCIÓN/REDEFINICIÓN • Los atributos y métodos definidos en la superclase se heredan por las subclases. Si la propiedad se define nuevamente en la subclase, entonces esta definición es la utilizada en la subclase. • La capacidad de una clase derivada (subclase) para definir un miembro con el mismo nombre que un miembro heredado se denomina redefinición (anulación o sustitución son términos equivalentes). • class Telef { class Movil extends Telef{ class Fijo extends Telef { • public void sonar() { public void sonar() { public void sonar() { • System.out.print(" rin rin "); cancion.audio(); System.out. • } } print(" ron ron "); • } • Cuando se referencia al miembro redefinido desde un objeto de la subclase, se usará el miembro definido por dicha subclase. • El miembro heredado de la superclase no se pierde por ser redefinido, es posible acceder a dicho miembro cualificándolo (en Java con super). • La clase Fijo puede redefinir sonar(), añadiendo a las características de sonar() de Telef las propias de Fijo: • public void sonar() { • super.sonar(); • System.out.print(" ron ron ") • }

  14. CLASES ABSTRACTAS(I) • Las clases abstractas definen un concepto o tipo generalizado y sirven para describir nuevas clases. Una clase abstracta no se puede instanciar y sólo tiene significado como clase base de otras clases. • En las jerarquías de clases, las superclases que se crean a partir de subclases con atributos y comportamientos comunes, y que sirven para derivar otras clases que comparten sus características, son clases abstractas.

  15. CLASES ABSTRACTAS(II) • Las clases abstractas representan conceptos generales, engloban las características comunes de un conjunto de objetos. Persona, en un contexto de trabajadores, es una clase abstracta que engloba las propiedades y métodos comunes a todo tipo de persona que trabaja para una empresa. • En Java el modificador abstract declara a una clase abstracta: • abstract class NombreClase { // ... } • Por ejemplo, • public abstract class Persona • { • private String apellido; • public void identificacion(String a, String c){ ...} • public abstract void darAlta(); • } • Las clases abstractas declaran métodos y variables instancia, y normalmente tienen métodos abstractos. Una clase que tiene un método abstracto debe declararse abstracta. • Los métodos abstractos no pueden ser static.

  16. CLASES ABSTRACTAS(III) • Normas de las clases abstractas. • Una clase abstracta se declara con la palabra reservada abstract como prefijo en la cabecera de la clase. • Una clase con al menos un mètodo abstracto es una clase abstracta y hay que declararla como abstracta. • Una clase derivada que no redefine un método abstracto es también clase abstracta. • Las clases abstractas pueden tener variables instancia y métodos no abstractos. • No se pueden crear objetos de clases abstractas.

  17. CLASES ABSTRACTAS(IV) Ejemplo: Se define un array de la clase abstracta Figura y se crean objetos de las clase concretas Rectangulo y Circulo. public abstract class Figura { public abstract double area(); ... } public class Circulo extends Figura { ...} Figura []af = new Figura[10]; for (int i = 0; i < 10; i++) { if (i %2 ==0) af[i] = new Rectangulo(2,7); else af[i] = new Circulo(3.5); }

  18. POLIMORFISMO

  19. POLIMORFISMO • El polimorfismo permite referirse a objetos de diferentes clases por medio del mismo elemento y realizar la misma operación de formas diferentes, de acuerdo al objeto a que se hace referencia en cada momento. • Otra forma de definir el polimorfismo: el envío del mismo mensaje desencadena acciones diferentes según el objeto que lo recibe. Un ejemplo típico es la operación arrancar cuando se aplica a diferentes tipos de motores; en cada caso la operación de arrancar se realiza de forma diferente. • La construcción del lenguaje que hace posible el polimorfismo es la ligadura dinámica (conocida también por ligadura tardía o postergada) entre llamadas a métodos y los cuerpos reales de dichos métodos. • La ligadura dinámica supone que el código a ejecutar en respuesta a un mensaje no se determinará hasta el momento de ejecución. • En Java la ligadura dinámica se basa en la capacidad de redefinir (reemplazar) métodos en la subclase, en el contexto de herencia.

  20. POLIMORFISMO • Conclusión: • En una jerarquía de herencia, cuando se llama a métodos desde una referencia a la superclase que han sido redefinidos en las clases derivadas, lo que se tiene en cuenta es el tipo del objeto actual referenciado. De tal forma que se ejecutará el método redefinido en el tipo actual. • En definitiva, al llamar a un mismo método sobre una misma variable referencia se producirá la llamada a métodos distintos dependiendo del objeto referenciado. • En una jerarquía de Vehículos que deben pagar el peaje de una autopista: • Vehiculo cual; // public abstract class Vehiculo { ... } • cual = new Turismo(); • cual.calculoTasa(); • cual = new CicloMotor(); • cual.calculoTasa(); • cual = new Camion(); • cual.calculoTasa(); • La llamada es sobre una variable de tipo Vehiculo, el método ejecutado depende del objeto actual referenciado. Ante un mismo mensaje se responde de formas diferente  POLIMORFISMO.

  21. USO DEL POLIMORFISMO • El polimorfismo se puede representar con un array de elementos que se refieren a objetos de diferentes tipos (clases), como sugiere Meyer . • Para poder utilizar polimorfismo en Java se deben seguir las siguientes reglas: • 1. Crear una jerarquía de clases con las operaciones importantes definidas por las métodos miembro declaradas como abstractos en la clase base. • 2. Las implementaciones específicas de los métodos abstractos se deben hacer en las clases derivadas. Cada clase derivada puede tener su propia versión del método. • 3. Las instancias de estas clases se manejan a través de una referencia a la clase base • Realmente no es necesario declarar los métodos en la clase base abstrasctos, si después se redefinen (misma signatura) en la clase derivada.

  22. EJEMPLO DE POLIMORFISMO(1) • Consideremos la clase Instrumento como la clase base de la que se derivan otras clases, tales como Piano, Guitarra, GitarraEléctrica y Bombo. Cada instrumento musical debe tener la posibilidad de tocar una pieza y afinar. En este caso la clase Instrumento declara los siguientes métodos: • class Instrumento • { • public void tocar(String cd) • { • System.out.println("instrumento interpreta " + cd); • } • // public abstract bool afinar(); // NO SE DESARROLLA • } • Cada clase derivada debe definir sus propias versiones concretas de los métodos que han sido declarados en la clase base. class Piano extends Instrumento { public void tocar(String cd) { System.out.println( "Piano interpreta "+ cd); } } class Guitarra extends Instrumento { public void tocar(String cd) { System.out.println( "Guitarra " + cd); } }

  23. EJEMPLO DE POLIMORFISMO(2) • class Bombo extends Instrumento • { • public void tocar(string cd) • { • System.out.println( • "Bombo toca " + cd); }; • } • Por ejemplo, las siguientes llamadas: • Bombo b1; b1.tocar("Panocha"); • Guitarra g1; g1.tocar("Aranjuez"); • Instrumento it; it.tocar("Piano"); • son llamadas directas, y se enlazan a un código específico en la compilación ( ligadura estática). class GuitarraElectrica extends Guitarra { public void tocar(String cd) { System.out.println( "Guitarra electrica toca " + cd); } }

  24. EJEMPLO DE POLIMORFISMO(3) • Ahora se va a llamar al método redefinido tocar() a través de una referencia a la superclase Instrumento. • Instrumento pin[]= new Instrumento[5]; for (int i = 0; i < pin.length; i++) • pin[0] = new GuitaraElectica(); pin[i].tocar("Rumba"); • pin[1] = new Instrumento(); • pin[2] = new Guitara(); • pin[3] = new Bombo(); • pin[4] = new Piano(); • En la llamada pin[i].tocar("Rumba") se produce ligadura dinámica; el compilador no puede determinar cuál es la implementación específica del método tocar() que se ha de ejecutar. La salida que genera la ejecución: • Guitarra electrica toca Rumba • instrumento interpreta Rumba • Guitarra interpreta Rumba • Bombo toca Rumba • Piano interpreta Rumba • El polimorfismo es una característica de los lenguajes O.O que consiste en que el método exacto que se llama queda determinado en el momento de ejecución por la clase del objeto receptor.

  25. EJEMPLO: CLASES BEBIDA

  26. En el modelado de clases de una aplicación sobre tipos de bebidas se tiene las clases: Bebida. Atributos: precio, clave identificación métodos: constructor sin args., constructor con precio, constructor con clave y constructor con clave y precio. Redefinición de de toString() y finalize(). Además de métodos set y get Café. Amplia la clase Bebida. Atributos: descripción y país de origen. métodos: constructor sin args., constructor para inicializar objetos con precio y país. Redefinición de de toString() y finalize(). Además de métodos set y get Te. Amplia la clase Bebida. Atributos: minutos de reposo, tipo (negro, verde, rojo: Te.NEGRO = 1. Te.VERDE = 2, Te.ROJO = 3). métodos: constructor sin args., constructor para inicializar objetos con tipo y clave. Redefinición de de toString() y finalize().Además de métodos set y get Principal: crear un array de bebidas crear objetos Cafe/Te y guardarlos en el array recorrer el array de bebidas, mostrar las características de cada bebida y el precio. Repetir la creación de objetos pero guardarlos en un Vector.

  27. Clase abstracta Bebida. Archivo Bebida.java (I) package Bebidas; public abstract class Bebida { protected double precio; protected String idt; /** Constructores */ public Bebida() throws BebidaException { this(0.0, "b000-00"); } public Bebida(double p, String id) throws BebidaException { if (p <= 0.0) throw new BebidaException("Datos de Bebida no correctos: " + p); precio = p; idt = id; } public Bebida(double p) throws BebidaException { this(p, "b000-00"); }

  28. Clase abstracta Bebida. Archivo Bebida.java (II) public Bebida(String id) throws BebidaException { this(0.0, id); } /** métodos de acceso */ public void set(double p)throws BebidaException { if (p <= 0.0) throw new BebidaException("Datos de Bebida no correctos: " + p); precio = p; } public void set(String id) { idt = id; } public double getPrecio() { return precio; }

  29. Clase abstracta Bebida. Archivo Bebida.java (III) public String getIdt() { return idt; } /** redefinición de métodos */ public String toString() { return "Precio: " + precio + ", " + " Identificación:" + idt; } protected void finalize() { System.out.println("Bebida " + toString() + " liberada"); } }

  30. Clase Café, deriva de Bebida. Archivo Cafe.java (I) package Bebidas; public class Cafe extends Bebida { private String descripcion = "NO INFO "; private String pais; /** Creates a new instance of Cafe */ public Cafe() throws BebidaException { this(1,"Brasil"); } public Cafe (double precio, String pais)throws BebidaException { super(precio); this.pais = pais; } /** métodos de acceso a miembros */ public void setPais(String p) { pais = p; }

  31. Clase Café, deriva de Bebida. Archivo Cafe.java (II) public void setDescripcion(String d) { descripcion = d; } public String getDescripcion() { return descripcion; } /** redefinición de métodos */ public String toString() { return "CAFE: "+ super.toString() + ". Pais: " + pais+ ", " + "\nCaracteristicas:" + descripcion; } protected void finalize() { super.finalize(); System.out.println("Cafe" + getDescripcion() + " liberada"); } }

  32. Clase Te, deriva de Bebida. Archivo Te.java (I) package Bebidas; public class Te extends Bebida { private int minutos; public enum Tipo {NEGRO, VERDE, ROJO;} Tipo tipo; public Te() throws BebidaException { this( "NEGRO", "00-1t"); } public Te(String tipo, String clave) throws BebidaException { super(0.5, clave); this.tipo = Enum.valueOf(Tipo.class, tipo); // método static de clase java.lang.Enum, // devuelve la constante enumerada }

  33. Clase Te, deriva de Bebida. Archivo Te.java (II) /** métodos de acceso a miembros */ public void setTiempo(int t) { minutos = t; } public void setTipo(String tipo) { this.tipo = Enum.valueOf(Tipo.class, tipo); } public int getTiempo() { return minutos; } public String getTipo() { return tipo.toString(); // cadena con la cte enumerada actual }

  34. Clase Te, deriva de Bebida. Archivo Te.java (III) /** redefinición de métodos */ public String toString() { return "TE: " + super.toString() + ". TE " + getTipo()+ ", " + "\nTiempo de reposo:" + minutos; } protected void finalize() { super.finalize(); System.out.println("TE " + getTipo() + " liberada"); }

  35. Clase BebidaException, para control de errores. Archivo BebidaException.java package Bebidas; public class BebidaException extends Exception { /** Creates a new instance of BebidaException */ public BebidaException() { } public BebidaException(String m) { super(m); } public String getMessage() { return "Excepción comprobada: "+ super.getMessage(); } }

  36. Aplicación, en el método main() de la clase de prueba, se crean objetos de tipo Café o Te, se guardan en un array y, en paralelo, en un contenedor de tipo ArrayList. Una vez que se da entrada a los objetos, se recorre el array de tal forma que cada elemento se pone en println(), automáticamente se llama al método toString() de cada tipo de Bebida. En un caso se llama a toString() de Café, y en otro caso a toString() de Te, dependiendo del objeto al que en ese momento referencia Bebida; es una llamada polimórfica. También se recorre el contenedor ArrayList con un iterador, se diseña el típico while. La clase "importa" el paquete Bebidas para utilizar sus clases. Archivo PruebaBebida.java (I) import Bebidas.*; import java.util.*; public class PruebaBebida { static final int MX = 11; public PruebaBebida() { }

  37. Archivo PruebaBebida.java (II) public static void main(String[]a) { Bebida[] b; ArrayList <Bebida> ab; Scanner entrada = new Scanner(System.in); String idt; double precio; int i, op; i = 0; b = new Bebida[MX]; ab = new ArrayList<Bebida>(); do { System.out. println("Menú para elegir un tipo de bebida. 1 -> Café, 2 -> Te, 3 -> Salir"); do op = entrada.nextInt(); while (op < 1 || op >3) ;

  38. Archivo PruebaBebida.java (III) try { switch (op) { case 1 : String cp, ds; System.out.println("Bebida elegida café; teclea precio y código"); precio = entrada.nextDouble(); idt = entrada.next(); System.out.println("Pais de origen"); cp = entrada.next(); System.out.println("Descripción"); ds = entrada.next(); Cafe cf; cf = new Cafe(precio, cp); // inicializa al precio y pais de origen cf.setDescripcion(ds); cf.set(idt); // identificación // asigna el objeto if (i < b.length) b[i++] = cf; ab.add(cf); break;

  39. Archivo PruebaBebida.java (IV) case 2 : String t; int mn; System.out.println("Bebida elegida TE; teclea precio y código"); precio = entrada.nextDouble(); idt = entrada.next(); System.out.println("Tipo de Te (NEGRO, VERDE, ROJO)"); t = entrada.next().toUpperCase(); System.out.println("minutos de preparación"); mn = entrada.nextInt(); Te te; te = new Te(); // constructor por defecto te.setTipo(t); te.setTiempo(mn); te.set(idt); // identificación te.set(precio); // asigna el objeto if (i < b.length) b[i++] = te; ab.add(te); break;

  40. Archivo PruebaBebida.java (V) case 3 : System.out.println("Finaliza la entrada, "+i+" objetos leídos "); } } // cierre de la región controlada (bloque try) catch (BebidaException e) { System.out.println(e.getMessage()); } catch (Exception e) { System.out.println("Error global " + e); } finally { System.out.println("Bloque finally"); entrada.nextLine(); } } while (op != 3); // bucle de entrada

  41. Archivo PruebaBebida.java (VI) // se recorren los contenedores System.out.println("Recorre el array con un bucle "); for (int j = 0; j < i; j++) System.out.println(b[j].toString()); // no es necesario llamar a toString() // se recorren el contenedor ArraList Iterator <Bebida> it; it = ab.iterator(); // inicializa System.out.println("Itera por el contenedor "); while (it.hasNext()) { System.out.println(it.next()); it.remove(); // como ejemplo, no es necesario } System.out.println("Recorre el array con un bucle para liberar objetos "); for (int j = 0; j < i; j++) b[j] = null; System.gc(); } // cierra bloque de método main() } // fin de clase

  42. Propuesta: Añadir a la estructura la clase Manzanilla con estas características: Manzanilla. Amplia la clase Bebida. Atributos: composición-propiedades (cadena); esEngrano, esInfusion métodos: constructor sin args., constructor para inicializar objetos con precio, identificación y composición- propiedades. Métodos set/get. Redefinición de toString() y finalize(). Clase principal: modificar el menú con el fin de que también pueda crear objetos de tipo Manzanilla.

  43. INTERFACES

  44. INTERFACE(I) • Java incorpora una construcción del lenguaje, llamada interface, que permite declarar un conjunto de constantes y de cabeceras de métodos abstractos. Es como una clase abstracta pura. • En cierto modo, es una forma de declarar que todos los métodos de una clase son públicos y abstractos, con ello se especifica el comportamiento común de todas las clases que implementen el interfaz. • Puede contener atributos, pero siempre serán estáticos y constantes de forma implícita. • La declaración de un interface es similar a la de una clase; en la cabecera se utiliza la palabra reservada interface en vez de class, por ejemplo: public interface NodoG { boolean igual(NodoG t); NodoG asignar(NodoG t); void escribir(NodoG t); }

  45. INTERFACE(II) • Sintaxis: acceso interface NombreInterface { constante1; ... constanten; tipo1 nombreMetodo1(argumentos); ... tipon nombreMetodon (argumentos); } acceso visibilidad del interfaz definido, normalmente public • Un interfacees un tipo de referencia, por lo que se puede utilizar como argumento de un método, o como variable. Por ejemplo: NodoG g = new NodoPila();//class NodoPila implements NodoG{...}

  46. IMPLEMENTACIÓN DE UN INTERFACE • El interface especifica el comportamiento común que tiene un conjunto de clases. Dicho comportamiento se implementa en cada una de las clases. Para lo cual se utiliza una sintaxis similar a la derivación o extensión de una clase, con la palabra reservada implements en lugar de extends. • Sintáxis: class NombreClase implements NombreInterfaz { // definición de atributos // implementación de métodos de la clase // implementación de métodos de interface • La clase que implementa un interfaz tiene que especificar el código (la implementación) de cada uno de sus métodos . De no hacerlo la clase se convierte en clase abstracta y entonces debe de declararse abstract, es una forma de obligar a que cada método del interfaz se implemente.

  47. EJEMPLO DE INTERFACE (I) • Considerese una jerarquía de barcos, todos tienen como comportamiento común msgeSocorro() y alarma(). Las clases BarcoPasaje, PortaAvion y Pesquero implementan el comportamiento común. • Interface Barco: public interface Barco { void alarma(); void msgeSocorro(String av); }

  48. EJEMPLO DE INTERFACE (II) • Clase BarcoPasaje: public class BarcoPasaje implements Barco { private int eslora; private int numeroCamas = 101; public BarcoPasaje() { System.out.println("Se crea objeto BarcoPasaje."); } public void alarma() { System.out.println("¡¡¡ Alarma del barco pasajero !!!"); } public void msgeSocorro(String av) { alarma(); System.out.println("¡¡¡ SOS SOS !!!" + av); } }

  49. EJEMPLO DE INTERFACE (III) • Clase PortaAvion : public class PortaAvion implements Barco { private int aviones = 19; private int tripulacion; public PortaAvion(int marinos) { tripulacion = marinos; System.out.println("Se crea objeto PortaAviones."); } public void alarma() { System.out.println("¡¡¡ marineros a sus puestos !!!"); } public void msgeSocorro(String av) { System.out.println("¡¡¡ SOS SOS !!! " + av); } }

  50. EJEMPLO DE INTERFACE (IV) • Clase Pesquero : class Pesquero implements Barco { private int eslora; private double potencia; private int pescadores; String nombre; public Pesquero(int tripulacion) { pescadores = tripulacion; System.out.println("Se crea objeto Barco Pesquero."); } public void alarma() { System.out.println("¡¡¡ Alarma desde el pesquero " + nombre + " !!!"); } public void msgeSocorro(String av) { System.out.println("¡¡¡ SOS SOS !!!, " + av); } }

More Related