bloque4:polimorfismo
Diferencias
Muestra las diferencias entre dos versiones de la página.
| Ambos lados, revisión anteriorRevisión previa | |||
| bloque4:polimorfismo [04/03/2018 20:10] – [Operador instanceof] Fernando Valdeón | bloque4:polimorfismo [05/03/2018 11:35] (actual) – borrado Fernando Valdeón | ||
|---|---|---|---|
| Línea 1: | Línea 1: | ||
| - | ====== Herencia: Polimorfismo ====== | ||
| - | El **polimorfismo** es otro de los pilares de la programación orientada a objetos, junto al **encapsulamiento, | ||
| - | Básicamente consiste en acceder a miembros de una subclase mediante un tipo de datos de su superclase. | ||
| - | |||
| - | ===== Concepto de polimorfismo ===== | ||
| - | Viene del término de biología en el que un organismo puede tener diferentes formas. En programación orientada a objetos podemos tener un aparentemente un objeto que se comporta de modo distinto. | ||
| - | |||
| - | Para explicar esto vamos a crear 3 clases: Vehiculo, Coche y Moto | ||
| - | <code java> | ||
| - | public Class Vehiculo{ | ||
| - | | ||
| - | | ||
| - | | ||
| - | ... | ||
| - | | ||
| - | this.numRuedas = numRuedas; | ||
| - | this.potencia = potencia; | ||
| - | this.matricula = matricula; | ||
| - | } | ||
| - | |||
| - | | ||
| - | System.out.println(" | ||
| - | System.out.println(" | ||
| - | System.out.println(" | ||
| - | System.out.println(" | ||
| - | } | ||
| - | } | ||
| - | </ | ||
| - | |||
| - | A continuación creamos dos subclases: Coche y Moto | ||
| - | |||
| - | <code java> | ||
| - | //Clase Coche | ||
| - | public class Coche extends Vehiculo{ | ||
| - | | ||
| - | |||
| - | | ||
| - | super(matricula, | ||
| - | this.numPuertas = numPuertas; | ||
| - | |||
| - | | ||
| - | return numPuertas; | ||
| - | } | ||
| - | |||
| - | | ||
| - | | ||
| - | super.mostrarEspecificaciones(); | ||
| - | System.out.println(" | ||
| - | System.out.println(" | ||
| - | | ||
| - | } | ||
| - | |||
| - | //Clase Moto | ||
| - | public class Moto extends Vehiculo{ | ||
| - | | ||
| - | |||
| - | | ||
| - | super(matricula, | ||
| - | this.marca = marca; | ||
| - | } | ||
| - | |||
| - | | ||
| - | return marca; | ||
| - | } | ||
| - | |||
| - | | ||
| - | | ||
| - | super.mostrarEspecificaciones(); | ||
| - | System.out.println(" | ||
| - | System.out.println(" | ||
| - | } | ||
| - | } | ||
| - | </ | ||
| - | |||
| - | ==== Uso de polimorfismo ==== | ||
| - | Ahora que ya tengo las 3 clases creadas, vamos a ver en qué consiste: | ||
| - | |||
| - | <code java> | ||
| - | //Creo un vehiculo con matricula, potencia y ruedas | ||
| - | Vehiculo vehiculo1 = new Vehiculo(" | ||
| - | |||
| - | //Creo otro vehiculo de subtipo Moto | ||
| - | Vehiculo vehiculo2 = new Moto(" | ||
| - | |||
| - | //Creo otro vehiculo de subtipo Coche | ||
| - | Vehiculo vehiculo3 = new Coche(" | ||
| - | |||
| - | //Ejecuto el mismo método para los 3 vehiculos | ||
| - | //El mismo método actúa de forma distinta | ||
| - | vehiculo1.mostrarEspecificaciones(); | ||
| - | vehiculo1.mostrarEspecificaciones(); | ||
| - | vehiculo1.mostrarEspecificaciones(); | ||
| - | |||
| - | |||
| - | //Intento acceder a métodos de las subclases | ||
| - | vehiculo2.getMarca(); | ||
| - | vehiculo3.getNumPuertas() | ||
| - | //No es posible ya que el tipo Vehiculo no tiene esos métodos | ||
| - | |||
| - | </ | ||
| - | |||
| - | Yo puedo llamar al método '' | ||
| - | |||
| - | Sin embargo si desde una variable de la superclase '' | ||
| - | |||
| - | Tampoco se permite crear almacenar un objeto de la superclase en una variable de una subclase: | ||
| - | |||
| - | <code java> | ||
| - | |||
| - | ===== UpCasting ===== | ||
| - | Como hemos visto, podemos referenciar objetos de una subclase mediante variable de un superclase. | ||
| - | |||
| - | <code java> | ||
| - | |||
| - | Esto se conoce como **UpCasting, | ||
| - | |||
| - | Cualquier objeto se puede castear implícitamente a una variable de tipo '' | ||
| - | |||
| - | Con el **UpCasting** ganamos generalización, | ||
| - | |||
| - | ===== DownCasting ===== | ||
| - | Si se quiere recuperar la información de una subclase cuando tenemos una variable de la superclase, será necesario moverse hacia abajo en la jerarquía mediante una conversión de tipo. | ||
| - | |||
| - | Esta conversión a un tipo más específico (subclase) desde un tipo más general, se conoce como **DownCasting o conversión hacia abajo**, y se realiza mediante una operación de casting: | ||
| - | |||
| - | <code java> | ||
| - | //UpCasting | ||
| - | Vehiculo vehiculo1 = new Coche(); | ||
| - | Vehiculo vehiculo2 = new Moto(); | ||
| - | |||
| - | //No puedo llamar al método | ||
| - | vehiculo1.getNumPuertas(); | ||
| - | |||
| - | // | ||
| - | Coche miCoche = (Coche) vehiculo1(); | ||
| - | Moto miMoto = (Moto) vehiculo2(); | ||
| - | |||
| - | //Puedo volver a llamar a sus métodos miembro | ||
| - | miCoche.getNumPuertas(); | ||
| - | miMoto.getNumPuertas(); | ||
| - | |||
| - | //También se permite | ||
| - | ((Coche)vehiculo1).getNumPuertas(); | ||
| - | ((Moto)vehiculo2).getMarca(); | ||
| - | </ | ||
| - | |||
| - | ===== Operador instanceof ===== | ||
| - | Como acabamos de ver, es posible que una variable de referencia de un tipo más general (Vehiculo) pueda contener la referencia de algún subtipo (subclase | ||
| - | de Vehiculo) de objeto. | ||
| - | |||
| - | Esto nos facilita las cosas cuando trabajamos con distintas subclases, ya que podemos tratarlas como un elemento de la superclase: | ||
| - | <code java> | ||
| - | ArrayList< | ||
| - | |||
| - | listaVehiculos.add(new Coche()); | ||
| - | listaVehiculos.add(new Moto()); | ||
| - | listaVehiculos.add(new Camion()); | ||
| - | listaVehiculos.add(new Avion()); | ||
| - | </ | ||
| - | |||
| - | Pero como también hemos dicho, puede que perdamos información acerca de cada objeto almacenado. | ||
| - | El operador '' | ||
| - | |||
| - | <code java> | ||
| - | for(Vehiculo vehiculo : listaVehiculos){ | ||
| - | | ||
| - | //Lo gestiono como coche | ||
| - | Coche coche = (Coche)vehiculo; | ||
| - | }else if(vehiculo instanceof Moto){ | ||
| - | //Lo gestiono como moto | ||
| - | Moto moto = (Moto)vehiculo; | ||
| - | }else if(vehiculo instanceof Camion){ | ||
| - | //Lo gestiono como camion | ||
| - | Camion camion = (Camion)vehiculo; | ||
| - | }else if(vehiculo instanceof Avion){ | ||
| - | //Lo gestiono como avion | ||
| - | Avion avion = (Avion)vehiculo; | ||
| - | } | ||
| - | } | ||
| - | |||
| - | </ | ||
| - | |||
| - | |||
| - | También tenemos el método '' | ||
| - | |||
| - | ---- | ||
| - | |||
| - | (c) {{date> %Y}} Fernando Valdeón | ||
bloque4/polimorfismo.1520194241.txt.gz · Última modificación: 16/09/2024 20:53 (editor externo)
