Documento 89541

Anuncio
Departamento de Informática
Universidad Técnica Federico Santa María
Departamento de Informática
Lenguajes de Programación
Lenguajes de Programación
Universidad Técnica Federico Santa María
Paradigmas de Desarrollo de
Software
3.2 Programación Orientada a
Objetos
• Programación orientada a procedimientos
(años ´70)
– Subprogramas y bibliotecas de subprogramas
• Programación orientada a datos
(años ´80)
Herencia, polimorfismo y ligado
dinámico
– Tipos abstractos de datos
• Programación orientada a objetos
1
III-2
Departamento de Informática
Universidad Técnica Federico Santa María
Departamento de Informática
Lenguajes de Programación
Universidad Técnica Federico Santa María
Lenguajes de Programación
Visión Computacional OO
(PURA)
OO en el Diseño de Lenguajes
• OO Puros (e.g. Smalltalk)
• OO no puros
• Un programa es un conjunto de objetos (instancias
de alguna clase), que corresponden a una
abstracción del mundo real (problema)
– mantienen elementos de otros paradigma (e.g.
Java y Eiffel de los imperativos)
• Un objeto se comunica con otro objeto enviando
un mensaje a algún método de este último, el cual
le puede retornar otro objeto como resultado
• Lenguajes Extendidos a OO
– Extensión de imperativo (e.g. C++ y Ada 95)
• Procesamiento del mensaje puede alterar el estado
del objeto (sus variables internas).
– Extensión de funcional (e.g. CLOS)
III-3
Departamento de Informática
Universidad Técnica Federico Santa María
III-4
Departamento de Informática
Lenguajes de Programación
Universidad Técnica Federico Santa María
Lenguajes de Programación
Soporte para Programación
Orientada a Objetos
Problemas de Reuso con TDAs
• Los TDAs son las unidades a reusar, pero:
• Tipos de Datos Abstractos
• Generalmente, requieren ser adaptadas para el nuevo
uso
• Hacer las modificaciones implicaría entender los
detalles de implementación del TDA reutilizado
• ¿Cómo representar relaciones entre distintos
TDAs?
• Por ejemplo, relación padre-hijo (relación de
subordinación)
– Clases y Objetos
• Herencia
– Simple y múltiple
• Polimorfismo, con especie particular de
ligado dinámico de métodos a mensajes
– Clases y métodos virtuales
III-5
III-6
Departamento de Informática
Departamento de Informática
Universidad Técnica Federico Santa María
Lenguajes de Programación
Lenguajes de Programación
Universidad Técnica Federico Santa María
Concepto Herencia
Clases y Objetos
• Una clase define un tipo abstracto de dato
• Los objetos son instancias de una clase, y por lo
tanto ocupan memoria.
• Se les puede instanciar en forma estática, del stack
o del heap (C++ permite las tres formas).
• Si se crean del heap, su destruccción es explícita o
implícita (e.g. C++ es explícita y Java es implícita)
• Permite reusar tipos de datos abstractos ya
definidos, sin alterarlos.
• La reutilización se realiza definiendo
nuevos TDA que modifican o agregan
(datos y/o métodos) al TDA de base.
• Por lo tanto, permite adaptar un TDA a las
condiciones particulares de un problema
con menor esfuerzo
III-7
Departamento de Informática
Universidad Técnica Federico Santa María
III-8
Departamento de Informática
Lenguajes de Programación
Lenguajes de Programación
Universidad Técnica Federico Santa María
Mecanismo de Herencia
Jerarquía de Herencia
• Un TDA se denomina clase, y las que
heredan de una clase base se denominan
clases derivadas (o subclases)
• Un TDA se deriva de una clase padre
denominada superclase
usa
Cliente
Datos
Clase (base)
Métodos
Hereda (es un)
Subclase
Datos
Métodos
III-9
Departamento de Informática
Universidad Técnica Federico Santa María
III-10
Departamento de Informática
Lenguajes de Programación
Lenguajes de Programación
Universidad Técnica Federico Santa María
Herencia Simple
Ejemplo: Herencia en C++
class empleado {
char
*nombre;
short edad;
short depto;
int
sueldo;
public :
empleado
*proximo;
void imprimir ();
//
}
• La nueva clase hereda sus propiedades a
partir de una sola clase base
Clase base
class jefe : public empleado {
short nivel;
public :
empleado* esclavos;
void imprimir (); // es diferente a empleado::imprimir
//
};
III-11
Subclase
Subclase
III-12
Departamento de Informática
Departamento de Informática
Lenguajes de Programación
Universidad Técnica Federico Santa María
Lenguajes de Programación
Universidad Técnica Federico Santa María
Herencia Múltiple
Problemas con Herencia Múltiple
• La nueva clase hereda sus propiedades a
partir de dos o más clases
• Colisión de nombres introduce una
complicación
• Pérdida de eficiencia por su mayor
complejidad (en el ligado de los métodos)
• No está claro que su uso mejore el diseño y
mantención de sistemas, considerando la
mayor complejidad de organización
...
Clases bases
Subclase
III-13
Departamento de Informática
Universidad Técnica Federico Santa María
III-14
Departamento de Informática
Lenguajes de Programación
Lenguajes de Programación
Universidad Técnica Federico Santa María
Polimorfismo mediante
Ligado Dinámico de Métodos
Ejemplo:
Ligado Dinámico de Métodos
• Permite crear variables del tipo de la clase del
padre que pueden referenciar objetos de cualquier
subclase (polimorfismo)
Figura
Datos
dibujar
rotar
• Las subclases pueden tener métodos que llevan el
mismo nombre del padre, pero que las subclases
las adaptan con otra implementación (override)
• Cuando se invoca un método de este tipo, se debe
dinámicamente hacer el ligado al método que
corresponde (dynamic binding).
Triángulo
Cuadrado
Datos
dibujar
rotar
Datos
dibujar
rotar
III-15
Departamento de Informática
Universidad Técnica Federico Santa María
III-16
Departamento de Informática
Lenguajes de Programación
Universidad Técnica Federico Santa María
Clases y Métodos Virtuales
Lenguajes de Programación
Polimorfismo en C++
class figura {
// ...
public:
virtual void rotar (int) = 0;
virtual void dibujar (void) = 0;
// ...
};
• A veces, la jerarquía de clases hace que para una
clase particular, no tenga sentido la creación de
objetos.
• En tal caso, la clase puede definir el prototipo de
métodos genéricos que son implementados en
todas las clases derivadas.
– Tales métodos se denominan métodos virtuales.
– La clase que posee estos métodos se denomina clase
virtual.
class circulo: public figura {
real radio;
public:
void rotar (int) {}
// anula figura::rotar
void dibujar (void);
// anula figura::dibujar
circulo (punto p, real radio);
};
figura *f[100];
...
for (int i=0; i<n; i++)
f[n]->dibujar();
III-17
III-18
Descargar