Programación 3: clases derivadas y polimorfismo

32
Paúl Arévalo Programación 3 Capítulo 4: Clases derivadas y Polimorfismo

Transcript of Programación 3: clases derivadas y polimorfismo

Page 1: Programación 3: clases derivadas y polimorfismo

Paúl ArévaloProgramación

3

Capítulo 4: Clases derivadas y Polimorfismo

Page 2: Programación 3: clases derivadas y polimorfismo

IntroducciónEste capítulo introduce el concepto de herencia y clases derivadas.

La herencia hace posible crear jerarquías de clases relacionadas y reduce la cantidad de código redundante en componentes de clases.La herencia es una herramienta poderosa que proporciona un marco adecuado para producir software fiable, comprensible, de bajo coste, adaptable y reutilizable.

Page 3: Programación 3: clases derivadas y polimorfismo

Contenido del Capítulo1. Clases Derivadas.2. Herencia Pública.3. Constructores en herencia.4. Métodos y atributos no derivables.5. Conversiones entre objetos de clase derivada y clase base.6. Métodos abstractos.7. Poliformismo.8. Interfaces.

Page 4: Programación 3: clases derivadas y polimorfismo

Clases DerivadasLa clase derivada se crea a partir de otra ya existente, denominada clase base.

Figura

La clase base y la clase derivada tienen código y datos comunes.

Triángulo

Cuadrado

Círculo

Page 5: Programación 3: clases derivadas y polimorfismo

Declaración de una clase derivadaJava soporta el mecanismo de extensión (extends).

class Clase_Derivada extends Clase_Base

Una vez creada la clase derivada, el siguiente paso es añadir los nuevos miembros que se requieren para cumplir las necesidades específicas de la nueva clase.

Nombre de la clase derivada

Palabra reservada que indica derivación

Nombre de la clase base

{// Miembros específicos de la clase derivadaprivate int nuevoMiembro;public void nuevoMétodo() { … }

}

Page 6: Programación 3: clases derivadas y polimorfismo

Problemas de diseño de clases derivadasNo siempre resulta fácil establecer la relación de herencia más óptima entre clases.Existen diferentes tipos de clasificaciones según el criterio de selección (discriminador).

Empleado

ComisiónAsalariado

PorHoras

DedicaciónPlena

DedicaciónParcial

Fijo Eventual

Page 7: Programación 3: clases derivadas y polimorfismo

Sobrecarga de métodos en clases derivadasDefinición de métodos del mismo nombre pero con distinto número o tipos de argumentos.class Figura {

public void mover(int x) { … }public void mover(double x, double y) { … }}

class Circulo extends Figura {public void mover(int n, double x, double y) { … }}

Page 8: Programación 3: clases derivadas y polimorfismo

Herencia PúblicaEn una clase existen secciones públicas, privadas, protegidas y con la visibilidad por defecto, que se denomina amigable.La herencia en Java siempre es pública.

Page 9: Programación 3: clases derivadas y polimorfismo

Herencia Públicapublic class Clase_Derivada extends Clase_Base { … }

Visible desde otro paquete

(opcional)

Page 10: Programación 3: clases derivadas y polimorfismo

Constructores en herenciaReglas1. El constructor de la clase base se invoca antes del

constructor de la clase derivada.2. Si una clase base es, a su vez, una clase derivada, se

invocan siguiendo la misma secuencia: constructor base, constructor derivada.

3. Los métodos que implementan a los constructores no se heredan.

4. Si no se especifica el constructor de la clase base, se invoca el constructor sin argumentos.

Page 11: Programación 3: clases derivadas y polimorfismo

Sintaxis de constructores en herencia

modificador ClaseDerivada(ListaParámetros) {super(ListaParámetrosBase);// Cuerpo constructor de la clase derivada

}

Visibilidad del constructor de la clase derivada

Nombre de la clase derivada

Lista de parámetros del constructor de la clase derivada

Lista de parámetros del constructor de la clase base

Page 12: Programación 3: clases derivadas y polimorfismo

Referencia a la clase base: superLos métodos heredados de la clase base pueden ser llamados desde cualquier método de la clase derivada

Puede ocurrir que haya métodos de la clase base que no interese que sean heredados en la clase derivada, debido a que se quiera que tenga una funcionalidad adicional.

Page 13: Programación 3: clases derivadas y polimorfismo

Métodos y clases no derivables: Atributo finalLa palabra reservada final se emplea para proteger la redefinición de los métodos de la clase base.

class Ventana {public void rellenar() { … }public final void numeroPixels()

{ …}}Una clase que no se quiere que sea clase base de otras clases se declara con el atributo final.

final class Integer { … }

Page 14: Programación 3: clases derivadas y polimorfismo

Conversiones entre objetos de clase derivada y clase baseAl declarar una clase como extensión o derivada de otra clase, los objetos de la clase derivada son a su vez objetos de la clase base.

Barco

DeVapor Velero

Parte correspondiente a BarcoParte propia de Velero

Barco barco;Velero velero = new Velero();DeVapor deVapor = new DeVapor();barco = velero; // conversión automáticabarco = deVapor; // conversión automática

Barco barco = new Barco();Velero velero = new Velero();velero = barco; // es errónea esta conversión.

Page 15: Programación 3: clases derivadas y polimorfismo

Métodos abstractosSi la palabra reservada abstract precede a la declaración de un método, este método se denomina abstracto, y le indica al compilador que será definido en una clase derivada.

class Figura{

public abstract double calcularArea();

public abstract void dibujar();}

abstract class Figura{

public abstract double calcularArea();

public abstract void dibujar();}

public class Circulo extends Figura { private double radio, px, py; public Circulo(double px, double py, double radio) { this.px = px; this.py = py; this.radio = radio; } public double calcularArea() { return Math.PI * radio * radio; } public void dibujar() { … }}

Una clase que no redefina un método abstracto heredado se convierte en clase abstracta.

Page 16: Programación 3: clases derivadas y polimorfismo

Clases abstractasLas clases abstractas representan conceptos generales, engloban las características comunes de un conjunto de objetos.Una clase que tiene un método abstracto debe declararse abstracta.No se pueden definir objetos, instanciar, de una clase abstracta.Las clases abstractas están en lo más alto de la jerarquía de clases, son superclases base, y por consiguiente siempre se establece una conversión automática de clase derivada a clase base abstracta.

Figura[] arrayFiguras = new Figura[2];for (int i = 0; i < 2; i++) {

if (i % 2 == 0) { arrayFiguras[i] = new Rectangulo();}

else { arrayFiguras[i] = new Circulo(); }}

Page 17: Programación 3: clases derivadas y polimorfismo

PolimorfismoEn POO, el polimorfismo permite que diferentes objetos respondan de modo diferente al mismo mensaje.El polimorfismo se establece con la ligadura dinámica de métodos.abstract class A { public abstract void dinamico();}

class B extends A { public void dinamico() { System.out.println("Dinámico B"); }}class C extends A { public void dinamico() { System.out.println("Dinámico C"); }}

A a = new B();a.dinamico();a = new C();a.dinamico();

Dinámico BDinámico C

Page 18: Programación 3: clases derivadas y polimorfismo

Uso del PolimorfismoLa forma de usar el polimorfismo es a través de referencias a la clase base.El polimorfismo se puede representar con un array de elementos que se refieren a objetos de diferentes tipos, como sugiere Meyer.Para poder utilizar polimorfismo en Java se deben seguir las siguientes reglas:

● Crear una jerarquía de clases con las operaciones importantes definidas por los métodos miembro declarados como abstractos en la clase base.

● 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. Por ejemplo, la implementación del método añadir() varía de un tipo de archivo a otro.● Las instancias de estas clases se manejan a través de una referencia a la clase base.

Este mecanismo es la ligadura dinámica, que es la esencia del polimorfismo en Java.Realmente, no es necesario declarar los métodos en la clase base como abstractos, si después se redefinen en la clase derivada.

Page 19: Programación 3: clases derivadas y polimorfismo

Ventajas del Polimorfismo● Especialización de clases derivadas. El uso más común del polimorfismo es

derivar clases especializadas de clases que han sido definidas. Así, por ejemplo, una clase Cuadrado es una especialización de la clase Rectangulo (cualquier cuadrado es un tipo de rectángulo). Esta clase de polimorfismo aumenta la eficiencia de la subclase, mientras conserva un alto grado de flexibilidad y permite un medio uniforme de manejar rectángulos y cuadrados.

● Estructuras de datos heterogéneos. A veces es muy útil poder manipular conjuntos similares de objetos. Con polimorfismo se pueden crear y manejar fácilmente estructuras de datos heterogéneos, que son fáciles de diseñar y dibujar, sin perder la comprobación de tipos de los elementos utilizados.

● Gestión de una jerarquía de clases. Las jerarquías de clases son colecciones de clases altamente estructuradas, con relaciones de herencia que se pueden extender fácilmente.

Page 20: Programación 3: clases derivadas y polimorfismo

InterfacesJava incorpora una construcción del lenguaje, llamada interface , que permite declarar un conjunto de constantes y de cabeceras de métodos abstractos.

En una interface, todos los métodos declarados son, por defecto, públicos y abstractos; por ello no es necesario especificar public ni abstract .

acceso interface NombreInterface{

constante 1; ... constante n; tipo1

nombreMetodo1(argumentos); ... tipon

nombreMetodoN(argumentos);}

Page 21: Programación 3: clases derivadas y polimorfismo

Implementación de una interfaz

class NombreClase implements NombreInterfaz{

// definición de atributos // implementación de métodos de la clase // implementación de métodos de la interfaz

}

La interfaz especifica el comportamiento común que tiene un conjunto de clases.

Todos los métodos deben ser implementados.

Múltiples interfaces Java no permite que una clase derive de dos o más clases, no permite la herencia múltiple. Sin embargo, una clase sí puede implementar más de una interfaz, sí puede tener el comportamiento común de varias interfaces.

Page 22: Programación 3: clases derivadas y polimorfismo

Jerarquía de una interfazLas interfaces se pueden organizar en forma jerárquica, de tal forma que los métodos sean heredados.

interface SuperBase1 {...}interface Base1 extends SuperBase1 {...}interface Base2 extends SuperBase1 {...}interface ComunDerivado extends Base1, Base2 {...}

Page 23: Programación 3: clases derivadas y polimorfismo

Herencia de clases e implementación de interfazLas interfaces no son clases, especifican un comportamiento (métodos) que va a tener la clase que lo implementa.

public interface Parque {...}public class EspacioProtegido {...}public class ZonaAves extends EspacioProtegido {...}public class ParqueNatural extends EspacioProtegido implements Parque{...}

Page 24: Programación 3: clases derivadas y polimorfismo

Variables interfazLas interfaces, al no ser clases, tampoco pueden instanciar objetos.Cualquier variable de una clase que implementa a una interfaz se puede asignar a una variable del tipo de la interfaz .

interface Bolsa { Bolsa insertar (Object elemento);

}public class Bolsa1 implements Bolsa {

public Bolsa insertar(Object elemento) { ... }}public class Bolsa2 implements Bolsa {

public Bolsa insertar(Object elemento) { ... }}

Bolsa bolsa;bolsa = new Bolsa1();bolsa.insertar("Manzana");

...bolsa = new Bolsa2();bolsa.insertar(new Integer(5));

Page 25: Programación 3: clases derivadas y polimorfismo

Resumen y ConclusionesLa relación entre clases es-un tipo de indica relación de herencia.Una clase nueva que se crea a partir de una clase ya existente, utilizando la propiedad de la herencia, se denomina clase derivada o subclase. La clase de la cual se hereda se denomina clase base o superclase.La herencia puede ser simple o múltiple.La herencia múltiple se produce cuando una clase deriva de dos o más clases base.Para llamar al constructor de la clase base desde el constructor de la clase derivada se emplea la palabra reservada super() .El polimorfismo es una de las propiedades fundamentales de la orientación a objetos. Estapropiedad significa que el envío de un mensaje puede dar lugar a acciones diferentes dependiendo del objeto que lo reciba.Un método abstracto (abstract) declarado en una clase convierte esta en una clase abstracta. Con los métodos abstractos se obliga a su redefinición en la clase derivada, en caso contrario, la clase derivada también es abstracta. No se puede instanciar objetos de clases abstractas.

Las interfaces de Java declaran constantes y operaciones comunes a un conjunto de clases. Las operaciones son métodos abstractos que deben definir las clases que implementan el interface.

Para implementar el polimorfismo, un lenguaje debe soportar el enlace entre la llamada a un método y el código del método en tiempo de ejecución; es la ligadura dinámica o vinculación tardía. Esta propiedad se establece en el contexto de la herencia y de la redefinición de los métodos polimórficos en cada clase derivada.

Java pemite declarar métodos con la propiedad de no ser redefinibles, por medio del modificador final . También, con el modificador final se puede hacer que una clase no forme parte de una jerarquía.

Page 26: Programación 3: clases derivadas y polimorfismo

¿Preguntas?¿Qué diferencias existen entre sobrecarga de métodos y redefinición de métodos?¿Describir las diversas utilizaciones de la referencia super?¿Qué diferencias se pueden encontrar entre this y super ?

Page 27: Programación 3: clases derivadas y polimorfismo

Problema 4.9

Page 28: Programación 3: clases derivadas y polimorfismo
Page 29: Programación 3: clases derivadas y polimorfismo
Page 30: Programación 3: clases derivadas y polimorfismo
Page 31: Programación 3: clases derivadas y polimorfismo

ReferenciasJoyanes Aguilar, L., Zahonero Martínez, I., 2008. Estructuras de datos en Java. McGraw-Hill, Madrid, España.

Meyer, B.: Object-Oriented Software Construction. Prentice-Hall, New York, 1998

Miguel Behr, Desarrollo de Software Adaptable, http://www.concierto.com/articulos/archivos/2007/02/desarrollo-de-software-adaptable/

Budd, T. An introduction to object-oriented programming, Pearson, 2002.

Page 32: Programación 3: clases derivadas y polimorfismo

Gracias.