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 |