Está en la página 1de 19

Diseño y

Programación
Orientados a Objetos
Conferencia # 7
Herencia y polimorfismo

Facultad Ing. Informática


Bibliografía
Timothy Budd. Introducción a la POO.
• Epígrafe 2.4.
•Cap. 6.
•Epígrafes 7.1 y 7.2.
•Epígrafes 9.1 y 9.2.
•Epígrafes 12.1 – 12.3
•Cap. 13.
Bibliografía
Bruce Eckel. Thinking in Java.
• Cap. 1. Epígrafes: Inheritance: reusing the
interface, Interchangeable objects with
polymorphism.
•Cap. 5. Subepígrafe: protected: inheritance
access.
•Cap. 6. Subepígrafe: final methods.
•Cap. 7. Polymorphism.
Contenido
• Heurísticas para crear subclases.
• Remplazo y refinamiento.
• Beneficios y costos de la herencia.
• Polimorfismo.
• Herencia y polimorfismo en Java.
• Principio Open-closed.
Heurísticas para crear subclases
• Especialización
• Especificación
• Construcción
• Generalización
• Extensión
• Limitación
• Variación
• Combinación o herencia múltiple
Beneficios de la herencia

• Reusabilidad del software


• Compartición de código
• Componentes de software
• Modelado rápido de prototipos
• Polimorfismo
• Ocultamiento de la información
Costos de la herencia
• Velocidad de ejecución

• Tamaño del programa

• Tiempo de procesamiento adicional


del paso de mensajes

• Complejidad de los programas


Polimorfismo
Palabra de origen griego, significa
aproximadamente “muchas formas”,
(poly = muchas, morphos = forma).
Ligadura
• Temprana, estática, compilación
(early binding)

• Tardía, dinámica, ejecución (late


binding)
Cylinder
# radius: float
Ejemplo
# length : float
+baseArea() : float
+volume(): float
HollowCylinder
- innerRadius: float
Área de la base * altura

+baseArea() : float
Ligadura
Cylinder c = new Cylinder(10,5);
float v = c.volume();

volume() baseArea()
Cylinder Cylinder
Ligadura temprana
Cylinder c;
c = new HollowCylinder(10,9,3);
float v = c.volume();

Cylinder.volume() Cylinder.baseArea()

HollowCylinder.baseArea()
Ligadura tardía
Cylinder c;
c = new HollowCylinder(10,9,3);
float v = c.volume();

Cylinder.volume() Cylinder.baseArea()

HollowCylinder.baseArea()
Herencia en Java
• Clases abstractas y concretas
• Visibilidad de atributos
• Métodos abstractos
• No hay herencia múltiple
Consideraciones
• Una clase abstracta no está obligada a tener
métodos abstractos.
• Toda clase que contenga algún método
abstracto o no proporcione implementación
para algún método abstracto declarado en
sus superclases debe ser declarada como
una clase abstracta.
• Los métodos abstractos deben tener la
misma firma a lo largo de toda la jerarquía.
Métodos abstractos
• No tienen implementación
• Solo en clases abstractas
• Sintaxis:
abstract<tipo><nombre método>(…)
Polimorfismo en Java
• La ligadura es tardía por defecto.
• Los constructores no son
polimórficos (static)
• Para especificar ligadura temprana:
métodos final o métodos privados.

public final <tipo><nombre método>()


Principio Open-closed
Entidades de software (clases, módulos,
funciones, etc.) deben estar abiertos para la
extensión, pero cerradas para su
modificación.

¿Cómo lograrlo?
Conclusiones
Propiedades de la POO

vs.

Tecnología

También podría gustarte