Polimorfismo Tecnología de Objetos Raúl Herrera A.
Ejemplo Suponga que queremos construir una biblioteca gráfica.  Queremos tener básicamente: puntos, segmentos, vectores, círculos, elipses, polígonos generales, triángulos, rectángulos, cuadrados y otros.
Ejemplo (2) Considere la clase polígono: class Poligono { int cantidad; // Número de vértices Punto vertices[]; // Lista de vértices public double perimetro() { // longitud del perímetro  // A partir del primer punto, se recorre el polígono sumando las  // distancias entre cada par de puntos. }  public void visualizar() { // Muestra el polígono en pantalla } public void rotar(Punto centro, double angulo) {  } public void trasladar(int a, int b)  { // Desplaza a horizontalmente y b verticalmente } }
Ejemplo: Clase Rectangulo class Rectangulo extends Poligono  { int lado1; int lado2;  Rectangulo(Punto centro, double l1, double l2, double angulo)  { // Crear con centro en "centro", orientación "angulo",  // y lados de longitud "l1" y "l2".  } public double perimetro ()  { return (lado1 + lado2) * 2  } }
¿Como sería la jerarquia para el ejemplo anterior?
¿Que es una asignación polimorfica? Supongamos que tenemos las siguientes declaraciones:   Poligono p; Rectangulo r;  Triangulo t; Entonces, las siguientes asignaciones son válidas:   p = r;  p = t;  Estas asignaciones se llaman  asignaciones polimórficas . Lo que ocurre en la primera asignación, es que la variable p que antes apuntaba a un objeto de tipo polígono, ahora punta a un objeto de tipo rectángulo:
Estructuras de Datos Polimorficas Supongamos que tenemos la siguiente clase: class PoliArray  { Poligono poli_array[]; ... public put(Poligono p, int indice)  {  // Pone p en la posición i del vector  }  }  Entonces las siguientes asignaciones son correctas:
Estructuras de Datos Polimorficas Poligono p;  Rectangulo r;  Cuadrado c;  Triangulo t;  PoliArray a; ...  a.put(p,1);  a.put(r,2); a.put(c,3);  a.put(t,4);
Estructuras de Datos Polimorficas Dada la jerarquía de clases de la figura anterior, las siguientes referencias a características de objetos también son correctas: Poligono p;  Rectangulo r;  p.area ...  p.vertices ...  p.rotar ...  r.diagonal ...  r.lado1 ...  r.vertices ...  r.perimetro ...
Estructuras de Datos Polimorficas Las siguientes referencias son incorrectas: p.lado1 ...  p.diagonal ...
¿Cuales son las Reglas de llamadas? Regla de llamadas a características:  En una llamada a una característica x.f donde el tipo de x se basa en una clase C, la característica f debe estar definida en uno de los antecesores de C. Un tipo U es  compatible  con un tipo T sólo si la clase de U es un descendiente de la clase base de T. Además, todo parámetro de U debe ser compatible con el correspondiente parámetro formal en T. Regla de compatibilidad:  Una asignación x = y (o el uso de y como un argumento real de la llamada a una rutina donde el correspondiente argumento formal es x) es válida solamente si el tipo de y es compatible con el tipo de x .
Composición
¿Que es la Composición de Objetos? Agregar o componer varios objetos para obtener una mayor funcionalidad Un objeto se puede construir a partir de otros objetos
¿Herencia o Composición? Herencia: permite definir una clase a partir de otra Reutilización de caja blanca: los aspectos internos de la superclase son visibles a las subclases Soportada por el lenguaje de programación Estática: se define en tiempo de compilación Composición: nueva funcionalidad mediante composición de objetos Reutilización de caja negra: no hay visibilidad de los aspectos internos de los objetos (objetos como cajas negras) Requiere interfaces bien definidas Dinámica: se define en tiempo de ejecución
¿Herencia o Composición? La herencia no permite cambios en tiempo de ejecución La herencia rompe la encapsulación La herencia impone al menos una parte de la representación física a las subclases Cambios en la superclase pueden afectar a las subclases Las implementaciones de superclase y subclases están ligadas Si hacen falta cambios para reutilizar una clase en nuevos dominios de aplicación habrá que cambiarla Limita la flexibilidad y al final la reutilización Por ello es más práctico utilizar interfaces y clases abstractas Ya que proporcionan menos o ninguna implementación
Herencia VS Composición La composición es dinámica, en tiempo de ejecución Los objetos adquieren referencias de otros objetos Los objetos tienen que respetar las interfaces de los otros objetos Exige un diseño cuidadoso de las interfaces Hay menos dependencias de implementación Habrá más objetos en el sistema y por tanto el comportamiento del sistema dependerá de las interacciones entre objetos en vez de estar definido en una clase
¿Herencia o Composición? Por tanto, es preferible la composición de objetos a la herencia de clases Sin embargo, El conjunto de componentes (objetos) no suele ser lo suficientemente rico en la práctica Mediante herencia se pueden crear nuevos componentes que componer con los existentes La herencia y la composición trabajan juntas
¿Que es la delegación? Delegación de objetos como alternativa a la herencia En la delegación un objeto que recibe una petición delega la ejecución del método a otro objeto (el delegado)  En el fondo esto es lo que hace una  subclase respecto a la superclase (al objeto this) Ejemplo: la clase Ventana, en vez de heredar de Rectangulo (aunque las ventanas son rectangulares) tiene una referencia a un objeto asociado de esa clase y delega algunas operaciones en ella Si hiciera falta cambiar la forma de la ventana en tiempo de ejecución, por ejemplo a Circulo, bastaría con cambiar la referencia del objeto correspondiente
Herencia VS Composición Ejemplo de delegación de objetos como alternativa a la herencia
¿Agregacion o Asociación? Agregación: un objeto es propietario o responsable de otro objeto  Relación es parte de Implica que ambos objetos tienen el mismo tiempo de vida Asociación: un objeto conoce otro (tiene una referencia) Un objeto puede solicitar una operación en otro objeto pero no es responsable de él La relación de asociación es más débil que la de agregación La diferencia es más de intención que de implementación Normalmente hay menos agregaciones que asociaciones pero son más duraderas Hay asociaciones que sólo existen durante la ejecución de un método
Polimorfismo Tecnología de Objetos Raúl Herrera A.

4 Polimorfismo

  • 1.
    Polimorfismo Tecnología deObjetos Raúl Herrera A.
  • 2.
    Ejemplo Suponga quequeremos construir una biblioteca gráfica. Queremos tener básicamente: puntos, segmentos, vectores, círculos, elipses, polígonos generales, triángulos, rectángulos, cuadrados y otros.
  • 3.
    Ejemplo (2) Considerela clase polígono: class Poligono { int cantidad; // Número de vértices Punto vertices[]; // Lista de vértices public double perimetro() { // longitud del perímetro // A partir del primer punto, se recorre el polígono sumando las // distancias entre cada par de puntos. } public void visualizar() { // Muestra el polígono en pantalla } public void rotar(Punto centro, double angulo) { } public void trasladar(int a, int b) { // Desplaza a horizontalmente y b verticalmente } }
  • 4.
    Ejemplo: Clase Rectanguloclass Rectangulo extends Poligono { int lado1; int lado2; Rectangulo(Punto centro, double l1, double l2, double angulo) { // Crear con centro en "centro", orientación "angulo", // y lados de longitud "l1" y "l2". } public double perimetro () { return (lado1 + lado2) * 2 } }
  • 5.
    ¿Como sería lajerarquia para el ejemplo anterior?
  • 6.
    ¿Que es unaasignación polimorfica? Supongamos que tenemos las siguientes declaraciones: Poligono p; Rectangulo r; Triangulo t; Entonces, las siguientes asignaciones son válidas: p = r; p = t; Estas asignaciones se llaman asignaciones polimórficas . Lo que ocurre en la primera asignación, es que la variable p que antes apuntaba a un objeto de tipo polígono, ahora punta a un objeto de tipo rectángulo:
  • 7.
    Estructuras de DatosPolimorficas Supongamos que tenemos la siguiente clase: class PoliArray { Poligono poli_array[]; ... public put(Poligono p, int indice) { // Pone p en la posición i del vector } } Entonces las siguientes asignaciones son correctas:
  • 8.
    Estructuras de DatosPolimorficas Poligono p; Rectangulo r; Cuadrado c; Triangulo t; PoliArray a; ... a.put(p,1); a.put(r,2); a.put(c,3); a.put(t,4);
  • 9.
    Estructuras de DatosPolimorficas Dada la jerarquía de clases de la figura anterior, las siguientes referencias a características de objetos también son correctas: Poligono p; Rectangulo r; p.area ... p.vertices ... p.rotar ... r.diagonal ... r.lado1 ... r.vertices ... r.perimetro ...
  • 10.
    Estructuras de DatosPolimorficas Las siguientes referencias son incorrectas: p.lado1 ... p.diagonal ...
  • 11.
    ¿Cuales son lasReglas de llamadas? Regla de llamadas a características: En una llamada a una característica x.f donde el tipo de x se basa en una clase C, la característica f debe estar definida en uno de los antecesores de C. Un tipo U es compatible con un tipo T sólo si la clase de U es un descendiente de la clase base de T. Además, todo parámetro de U debe ser compatible con el correspondiente parámetro formal en T. Regla de compatibilidad: Una asignación x = y (o el uso de y como un argumento real de la llamada a una rutina donde el correspondiente argumento formal es x) es válida solamente si el tipo de y es compatible con el tipo de x .
  • 12.
  • 13.
    ¿Que es laComposición de Objetos? Agregar o componer varios objetos para obtener una mayor funcionalidad Un objeto se puede construir a partir de otros objetos
  • 14.
    ¿Herencia o Composición?Herencia: permite definir una clase a partir de otra Reutilización de caja blanca: los aspectos internos de la superclase son visibles a las subclases Soportada por el lenguaje de programación Estática: se define en tiempo de compilación Composición: nueva funcionalidad mediante composición de objetos Reutilización de caja negra: no hay visibilidad de los aspectos internos de los objetos (objetos como cajas negras) Requiere interfaces bien definidas Dinámica: se define en tiempo de ejecución
  • 15.
    ¿Herencia o Composición?La herencia no permite cambios en tiempo de ejecución La herencia rompe la encapsulación La herencia impone al menos una parte de la representación física a las subclases Cambios en la superclase pueden afectar a las subclases Las implementaciones de superclase y subclases están ligadas Si hacen falta cambios para reutilizar una clase en nuevos dominios de aplicación habrá que cambiarla Limita la flexibilidad y al final la reutilización Por ello es más práctico utilizar interfaces y clases abstractas Ya que proporcionan menos o ninguna implementación
  • 16.
    Herencia VS ComposiciónLa composición es dinámica, en tiempo de ejecución Los objetos adquieren referencias de otros objetos Los objetos tienen que respetar las interfaces de los otros objetos Exige un diseño cuidadoso de las interfaces Hay menos dependencias de implementación Habrá más objetos en el sistema y por tanto el comportamiento del sistema dependerá de las interacciones entre objetos en vez de estar definido en una clase
  • 17.
    ¿Herencia o Composición?Por tanto, es preferible la composición de objetos a la herencia de clases Sin embargo, El conjunto de componentes (objetos) no suele ser lo suficientemente rico en la práctica Mediante herencia se pueden crear nuevos componentes que componer con los existentes La herencia y la composición trabajan juntas
  • 18.
    ¿Que es ladelegación? Delegación de objetos como alternativa a la herencia En la delegación un objeto que recibe una petición delega la ejecución del método a otro objeto (el delegado) En el fondo esto es lo que hace una subclase respecto a la superclase (al objeto this) Ejemplo: la clase Ventana, en vez de heredar de Rectangulo (aunque las ventanas son rectangulares) tiene una referencia a un objeto asociado de esa clase y delega algunas operaciones en ella Si hiciera falta cambiar la forma de la ventana en tiempo de ejecución, por ejemplo a Circulo, bastaría con cambiar la referencia del objeto correspondiente
  • 19.
    Herencia VS ComposiciónEjemplo de delegación de objetos como alternativa a la herencia
  • 20.
    ¿Agregacion o Asociación?Agregación: un objeto es propietario o responsable de otro objeto Relación es parte de Implica que ambos objetos tienen el mismo tiempo de vida Asociación: un objeto conoce otro (tiene una referencia) Un objeto puede solicitar una operación en otro objeto pero no es responsable de él La relación de asociación es más débil que la de agregación La diferencia es más de intención que de implementación Normalmente hay menos agregaciones que asociaciones pero son más duraderas Hay asociaciones que sólo existen durante la ejecución de un método
  • 21.
    Polimorfismo Tecnología deObjetos Raúl Herrera A.