Abstracción de Datos y Orientación a Objetos.. Vista General. Por qué la abstracción de datos y...

Preview:

Citation preview

Abstracción de Datos y Orientación a Objetos.

Vista General.

• Por qué la abstracción de datos y la

programación orientada a objetos.• Módulos y módulos tipo.• Clases y Herencia.• Contenedores.• Constructores.• Método dinámico de enlace, métodos

virtuales y clases abstractas.• Herencia Múltiple.

Avances de POO

• Reduce la carga conceptual.– Minimiza la cantidad de detalles que el

programador debe considerar.– Provee contenimiento de fallas y cambios.– Limita la porcion de programa que es necesario

recorrer al eliminar errores (debugging).– Limita la porcion de programa que es necesario

cambiar si la interfaz es la misma.

• Provee independencia entre los componentes del programa.– Facilita la reutilización de código.

Reutilización de Código.

• A menudo la funcionalidad e interfaz existente no es exactamente lo que se necesita.

• Útil para definir nuevas abstracciones como extensiones o refinamientos de abstracciones existentes.

Modulos en Modula-2

Programa Principal

Notar que:

Push, pop visible para ambos.Push, pop visible para módulos que los importanTop no visible del módulo de la pila

Módulos Tipo.

Múltiples instancias abstracción dada.

Clases = módulos tipo+ herencia.

Cada instancia de un módulo tipo o clase tiene su propia copia de las variables delmódulo o clase.

Módulos Tipo.• Permite que un módulo tenga varias instancias.• Implementación

– Datos conocidos estáticamente: desplazamiento estático dentro del módulo.

– Datos conocidos dinámicamente:• Porción de tamaño fijo.• Porción de tamaño variable.• Vector al principio de la porción de tamaño fijo (descriptor a tiempo de

corrida que contiene el tamaño de los datos dinámicos).

– Subrutinas• Código replicado para cada instancia(desperdicio de espacio).• Adicionalmente, parámetro escondido a la subrutina con la dirección de

almacenamiento de la instancia apropiada del módulo.

Declaración de una clase en C++

Una declaración puede ser puesta en un archivo .h separado del archivo .cc que contiene las definiciones.

La declaración debe tener toda la información: • El programador necesita usar la abstracción

correctamente.• El compilador para generar código necesita:

– Alguna información privada dentro de la declaración.– La expansión en línea que necesite el código.

Ejemplo de Declaración.

Declaración(puede contener información privada también).

Herencia

• Clases derivadas, clases hijas, subclases.– Tienen todos los datos y métodos de la clase

base.– Datos y métodos adicionales.

• Clase Base, Clase Padre, Superclase.• Jerarquía de clases.• Clase Básica “genérica".

Clase Básica Genérica

Ocultamiento o Reemplazo de miembros de la clase base.

• Para reemplazar un método de la clase base, se redefine en la clase derivada.

• El método de la clase base está aún accesible. – El operador de resolución de alcance es :: (en

C++)– Palabra clave Super (en Java y Smalltalk)– Renombramiento Explícito (en Eiffel)

Contenedores.

Abstraccion que sostiene una colección de objetos de alguna clase de elemento. Alternativas:

• Basado en una clase base Contenedor– Objetos derivados de la clase base.

• Listar nodos como objetos separados conteniendo un apuntador.

• Listar nodos miembros del objeto listado.

Diseñar jerarquías de clases consistentes intuitivas y útiles es difícil.

Herencia y Visibilidad en C++

• Herencia– Ocultamiento de métodos de la clase base en C++:

• Clase base privada (para ocultar)• Usando declaraciones (para hacerlos visibles)

– Miembros protegidos: visibles a métodos de la misma clase, derivadas o amigas .

– Miembros privados: visibles a métodos de la misma clase o amigas.

Ejemplo:

Resumen de Reglas de Visibilidad

• C++– Cualquier clase puede limitar la visibilidad de sus

miembros.– Una clase derivada puede restringir la visibilidad de

miembros de una clase base, pero no puede incrementarla.

– Una clase derivada que limita la visibilidad puede reestablecerla usando una declaración.

Resumen de Reglas de Visibilidad

• Eiffel– Las clases derivadas pueden tanto restringir como

incrementar la visibilidad de miembros de las clases base.

Java es como C++, excepto por: – No hay designación de “protegida” ni “privada” para

las clases base.– La palabra Protected hace que sea visible dentro del

paquete, además de dentro de las clases derivadas.– No hay clases amigas.

Constructores

Un constructor no localiza espacio.Inicializa espacio ya localizado.

Asuntos:• Elección de uno entre muchos constructores• Referencias versus valores• Orden de ejecución de los constructores.• Destructores vs. recolección de “basura”.

Herencia Múltiple.

• Herencia Múltiple: Las clases derivadas heredan características de más de una clase base.

• Opciones:– Herencia Simple (Simula, Smalltalk, Modula-3,

Ada 95, Oberon).– Herencia Múltiple (C++, Eiffel, CLOS)– Herencia Múltiple Limitada (mix-in) (Java).

Herencia Múltiple.

Implementación de Herencia Múltiple.

Asignación de una referencia a un objeto estudianteEn una variable del tipo gp_list_node* requiereUn cambio de vista añadiendo d.

La entrada tiene una corección thisque provee la vista derecha..

Asuntos Semánticos en Herencia Múltiple (I)

• Qué pasa si un método está definido en ambas clases base (y no está definido en la clase derivada?– CLOS: usa la versión de la clase que aparece

primero en el encabezado de la clase derivada.– Eiffel: static semantic error for the derived class– C++: Error semántico estático cuando se trate

de usar el método ambiguo (se debe emplear una operación de resolución de alcance para resolverlo).

Asuntos Semánticos en Herencia Múltiple(II)

• Qué pasa si un método es virtual en al menos una clase base, y queremos sobreescribirlo en la clase derivada?

• Existen tres opciones posibles para manejar este tipo de situación:– 1. Redefinir miembros ambiguos.– 2. Dar nuevos nombres.– 3. Usar clases “Interfaz”.

3. Usar interfaces.

1. Redefinir miembros ambiguos.

2. Dar nuevos nombres.

Está bien mientras debug_print no sea invocado en la vista estudiante de un objeto estudiante.

Asuntos Semánticos en H.M.(III)

Qué pasa si D hereda de B y C, y tanto B como C heredan de A?Una instancia de D debe contener una o dos copias de los miembros de A?

• Herencia Replicada: dos copias.– C++ (por defecto).– Eiffel (por renombramiento).

• Herencia compartida: una copia. – Eiffel (por defecto).– CLOS (a menos que se introduzcan interfaces).– C++ (especificando la clase base como virtual).

Herencia Replicada.

Cómo acceder a miembros de A de un objeto D?

• No se puede hacer directamente por nombre.

• Se usa un apuntador intermediario B* o C*.

Herencia Replicada.

Las entradas de Vtable consisten de pares(method_address, this_correction).

Herencia Compartida.

Herencia Compartida.

Qué pasa si B o C sobreescriben un método f,declarado en A? Cuál versión hereda D?

•C++: Las definiciones del descendiente dominan. Si ambos –B y C- redefinen f, es un error.

•Eiffel: D puede especificar cuál f quiere.

Herencia Compartida.

Apuntadores a la porción decampos de A,Para facilitatar una vista B Y una vista C view de un objetoD. Los apuntadoresson necesarios porque ahora no es posible tener vistas compactas de B y C del objeto D

Herencia Mix-in.• Interfaz: una clase compuesta

completamente de metodos abstractos.– No tienen miembros– No tienen implementaciones de sus métodos

• Herencia Mix-in:– Una clase base “real”.– Un número arbitrario de interfaces.

• Polymorfismo: El parámetro formal de un método puede ser de tipo interfaz.– Cualquier clase derivada de la interfaz puede

ser pasada como argumento.

Mix-in inheritance

Implementación• Método de búsqueda a tiempo de corrida.

– Anadir métodos de una interfaz al diccionario de métodos de cualquier clase que implemente la interfaz.

• Sin método de búsqueda a tiempo de corrida.– Aumentar la representación de objetos con

direcciones de vtables para las interfaces implementadas.

Implementación de Herencia Mix-in

Interfaces

Clase base “Real”

Clase DerivadaCorrecciones this

Data membersOf augmented_widgetonly

From named_widget

Lenguajes Reales y el OO Ideal.• Requieren o sólo permiten que el programador

escriba en OO?• Smalltalk: requiere• Modula-3, Ada, C++, Common Lisp: permiten• C++

– Los tipos simples no son clases.– Las subrutinas fuera de las clases.– Binding estático y uso de Mix-In replicado (por defecto).– Conserva todas las características de bajo nivel de C

(insta al programador que sabe C a escribir código parecido a C).

– C++ es OO en la misma medida que Lisp es funcional.

Orientado a Objetos en los distintos lenguajes.

• Hay tres conceptos básicos vinculados a la programación orientada a objetos:– La herencia.– La encapsulación.– Método dinámico de bindings.

• Los diferentes lenguajes de programación consideran estos conceptos fundamentales en distintos grados.

El Modelo de Objeto de SmallTalk.

• SmallTalk es el lenguaje orientado a objeto canónico.

• Está fuertemente integrado a su ambiente de programación.

• Usa un modelo de referencia no tipeado para todas sus variables.

• Las operaciones son conceptualizadas como mensajes enviados a objetos.

El Modelo de Objeto de SmallTalk.

• SmallTalk evalúa las expresiones de izquierda a derecha, sin precedencia ni asociatividad.

• Para los lazos controlados por enumeración, utiliza timesRepeat.

• Los bloques de SmallTalk permiten al programador tener constructores de control de flujo casi arbitrarios.

Recommended