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