Descargar

Programacion: Análisis Semántico y Chequeo de Tipos (página 3)

Enviado por Pablo Turmero


Partes: 1, 2, 3
edu.red

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

edu.red

Jerarquía de Herencia La relación subclase/superclase Definida por los “extends” Puede ser modelada mediante un grafo acíclico dirigido (DAG)

edu.red

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

edu.red

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

edu.red

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

edu.red

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

edu.red

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

edu.red

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

edu.red

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

edu.red

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

edu.red

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

edu.red

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

edu.red

Ejemplo: Herencia vs. Agregación

SUV es un vehículo SUV tiene un motor

class vehiculo { … }

class SUV extends vehiculo { motor power_plant; … }

edu.red

Herencia múltiple Permite que una clase sea una extensión de múltiples clases Lleva a semánticas más complicadas para subtipos

edu.red

Ejemplo de Herencia Múltiple class vehicle { … }

class yuppie_toys { … }

class SUV extends vehicle, yuppie_toys { … }

edu.red

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

edu.red

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

edu.red

¿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

edu.red

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;

edu.red

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

Partes: 1, 2, 3
 Página anterior Volver al principio del trabajoPágina siguiente