bloque4:polimorfismo
Diferencias
Muestra las diferencias entre dos versiones de la página.
Próxima revisión | Revisión previa | ||
bloque4:polimorfismo [04/03/2018 20:06] – creado 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: | ||
- | '' | ||
- | |||
- | ===== UpCasting ===== | ||
- | Como hemos visto, podemos referenciar objetos de una subclase mediante variable de un superclase. | ||
- | |||
- | Vehiculo vehiculo1 = new Coche(); | ||
- | |||
- | Esto se conoce como UpCasting, o conversión hacia arriba (desde una subclase a una superclase). Es un casting implicito y no es necesario indicar ninguna instrucción para realizar la conversión. | ||
- | |||
- | Cualquier objeto se puede castear implicitamente 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; | ||
- | } | ||
- | } | ||
- | |||
- | </ | ||
- | |||
- | |||
- | ---- | ||
- | |||
- | (c) {{date> %Y}} Fernando Valdeón |
bloque4/polimorfismo.1520193996.txt.gz · Última modificación: 16/09/2024 20:53 (editor externo)