Herencia
Herencia Sencilla
Cuando cada clase está restringida a tener una sola superclase inmediata (máximo)
Herencia Múltiple
Cuando cada clase puede tener más de una superclase inmediata
Jerarquía de Herencia
La relación subclase/superclase
Definida por los “extends”
Puede ser modelada mediante un grafo acíclico dirigido (DAG)
Jerarquía de Herencia
Car es un hijo de vehicle (subclase inmediata)
Vehicle es un padre de SUV (superclase inmediata)
4wd es un descendiente de vehicle (subclase)
Vehicle es un ancestro de 2-door (superclase)
vehicle
SUV
car
motorbike
4wd
2wd
4-door
2-door
5-door
Reglas de Control de Acceso
Conjunto de tipos de control de acceso usados por un lenguaje OO genérico (e.d. Espresso)
Visibilidad en scope
Acceso a datos
Acceso a métodos públicos
Acceso a métodos privados
Muchos lenguajes OO tienen controles de acceso más complicados
Visibilidad en Scope
Las variables y los campos de una clase pueden ser declarados en cualquier parte en el programa en la que se permita una declaración y la definición de la clase esté visible
Si un campo en una subclase y superclase usa el mismo nombre
La resolución de nombres se hace usando reglas de scope
Se trata el scope de la subclase dentro del scope de la superclase
Acceso a Datos
Los campos de datos de una clase sólo pueden ser accesados por los métodos definidos en esa clase
Una variación más permisiva:
Todos los métodos de las subclases pueden accesar los campos en la superclase
Acceso a métodos públicos
Todos los métodos públicos de una clase pueden ser invocados por cualquier método que pueda declarar una variable o un campo del tipo de la clase
Acceso a métodos privados
Los métodos privados de una clase sólo pueden ser invocados por:
Los métodos de esa clase
Los métodos de cualquier clase que sea descendiente de la clase
Ejemplo: control de acceso de C++
Una clase puede ser friend de otra clase
Los métodos y campos pueden ser
private: visibles a funciones miembro y friends
protected: visibles a funciones miembro, friends, y clases derivadas (y sus friends)
public: pueden ser usados por cualquier función
Conversión automática de tipos
Una expresión de una clase es coercionada a una clase ancestro cuando se requiera
Pero no al revés
Llamado “up-casting”
Siempre legal porque la subclase contiene todos los campos de la superclase
Down-casting
Esto es más permisivo
Conversión explícita de una clase ancestro a una clase descendiente
Sólo tiene sentido si el objeto fue creado inicialmente como en la subclase, pero después convertido a la superclase
No puede chequearse en tiempo de compilación
Métodos Estáticos vs. Dinámicos
Consecuencia de up-casting
Implementación del método declarado en una superclase puede ser desconocida al momento de compilar
El método es sobreescrito en una subclase
Variaciones de Lenguajes
Todos los métodos no declarados estáticos pueden ser up-casted
Sólo los métodos declarados virtuales pueden ser up-casted
Análisis e implementación de métodos dinámicos
No se puede efectuar ningún chequeo semántico
Necesitamos soporte en tiempo de corrida (runtime) al generar el código
Herencia vs. Agregación
Una clase T2 es una agregación de una clase T1 si T2 contiene uno o más campos de tipo T1
A diferencia de la herencia, T2 no puede accesar campos o métodos privados en T1
¿Cuándo heredear y cuándo agregar?
heredar: T2 es un T1
agregar: T2 tiene un T1
Ejemplo: Herencia vs. Agregación
SUV es un vehículo
SUV tiene un motor
class vehiculo {
…
}
class SUV extends vehiculo {
motor power_plant;
…
}
Herencia múltiple
Permite que una clase sea una extensión de múltiples clases
Lleva a semánticas más complicadas para subtipos
Ejemplo de Herencia Múltiple
class vehicle {
…
}
class yuppie_toys {
…
}
class SUV extends vehicle, yuppie_toys {
…
}
Jerarquía de Herencia Múltiple
Jerarquía de Herencia Múltiple es un DAG
Pregunta: ¿Sí tanto yuppie_toys como vehicle tienen un método price() cuándo SUV invoque a price, qué método se invoca?
vehicle
SUV
car
motorbike
4wd
2wd
4-door
2-door
5-door
toys
yuppie_toy
teen_toy
Jerarquía de Herencia Múltiple
Es todavía más complicado cuándo hay un ancestro común
Pregunta: ¿Cuántas instancias de bti van a ser incluidas en la clase SUV?
vehicle
SUV
car
motorbike
4wd
2wd
4-door
2-door
5-door
toys
yuppie_toy
teen_toy
big_ticket_items
¿Qué es un tipo polimórfico?
Procedimientos ordinarios permiten que el cuerpo sea ejecutado con argumentos de tipo fijo
Cada llamada a un procedimiento polimórfico ejecuta el cuerpo con el tipo de los argumentos
Beneficios del polimorfismo
Reuso de Código
Ejemplo
El mismo procedimiento puede aplicarse a una lista de enteros o a una lista de strings
Polimorfismo Paramétrico
Los procedimientos tienen tipos paramétrizados
Instanciamos el procedimiento con un tipo determinado de datos
Templates en C++
Ejemplo:
template class linked_list_elem {
T elem; linked_list_elem * next;
…
}
lined_list_elem integer_list;
lined_list_elem foo_list;
Lecturas
Tigre
6.1, Capítulos 7 y 8
Ballena
4.1, 4.2, 4.3, 4.4, 4.5
Dragón
Capítulo 8
Página anterior | Volver al principio del trabajo | Página siguiente |