viernes, 22 de junio de 2012

Unidad IV. POLIMORFISMO Otro concepto de la OOP es el polimorfismo. Un objeto solamente tiene una forma (la que se le asigna cuando se construye ese objeto) pero la referencia a objeto es polimórfica porque puede referirse a objetos de diferentes clases (es decir, la referencia toma múltiples formas). Para que esto sea posible debe haber una relación de herencia entre esas clases. Por ejemplo, considerando la figura anterior de herencia se tiene que: Una referencia a un objeto de la clase B también puede ser una referencia a un objeto de la clase A. Una referencia a un objeto de la clase C también puede ser una referencia a un objeto de la clase A. Una referencia a un objeto de la clase D también puede ser una referencia a un objeto de la clase A. Una referencia a un objeto de la clase E también puede ser una referencia a un objeto de la clase D. Una referencia a un objeto de la clase E también puede ser una referencia a un objeto de la clase A.


    Otro concepto de la POO es el polimorfismo. Un objeto solamente tiene una forma (la que se le asigna cuando se construye ese objeto) pero la referencia a objeto es polimórfica porque puede referirse a objetos de diferentes clases (es decir, la referencia toma múltiples formas). Para que esto sea posible debe haber una relación de herencia entre esas clases. Por ejemplo, considerando la figura anterior de herencia se tiene que:


    • Una referencia a un objeto de la clase B también puede ser una referencia a un objeto de la clase A.
    • Una referencia a un objeto de la clase C también puede ser una referencia a un objeto de la clase A.
    • Una referencia a un objeto de la clase D también puede ser una referencia a un objeto de la clase A.
    • Una referencia a un objeto de la clase E también puede ser una referencia a un objeto de la clase D.
    • Una referencia a un objeto de la clase E también puede ser una referencia a un objeto de la clase A.

3.1 Clasificacion de Herencia

La Herencia Simple indica que podemos definir n clases nuevas a partir de una clase padre o clase inicial.

Mientras que la herencia Múltiple indica que se pueden definir n clases nuevas a partir de varias clases padres o iniciales.

Si comparamos ambas formas de Herencia notamos que el diseño propio del lenguaje Java, imposibilita pensar el diseño de un programa aplicando herencia múltiple, sin embargo dicho concepto se podría aplicar por ejemplo en C++, donde con muha frecuencia se hace un uso indebido de las relaciones de herencia múltiple, lo cual hace que el mismo pierda integridad. En Java esto no ocurre, ya que no ofrece soporte para este tipo de relaciones.
Java permite únicamente Herencia Simple, es decir, las clases sólo podrán Heredar de una única clase padre, o superclase.
El truco de la Herencia en Java es que se reutiliza código creando nuevas clases, pero en vez de crearlas de la nada, se utilizan clases ya existentes (que otra persona ya ha construido y depurado). La gracia es usar clases sin manchar el código existente.
Para lograr la reutilización de código, ya vimos el semestre anterior el concepto de colaboración de clases, donde creamos objetos de las clases ya existentes, pero dentro de clases nuevas. A esto se le conoce como colaboración de clases o composición. Acá simplemente se está reutilizando la funcionalidad del código, no su forma. Este semestre, sin embargo, veremos una forma un poco más sutil.
Crearemos clases como si fueran un tipo de clase ya existente. Literalmente nos tomaremos la misma forma de la clase ya existente y le agregaremos más fucionalidades específicas, pero sin siquiera tocar la clase ya existente. A este proceso le llamamos Herencia, y finalmente es el compilador de Java quien hace toda la tarea.
La Herencia es uno de los conocimientos clave de la programación orientada a objetos, ya que incluso la misma estructura del Lenguaje Java implementa Herencias de forma implícita. Todo en Java son Herencias.

UNIDAD III. HERENCIA

En orientación a objetos la herencia es, después de la agregación o composición, el mecanismo más utilizado para alcanzar algunos de los objetivos más preciados en el desarrollo de software como lo son la reutilización y la extensibilidad. A través de ella los diseñadores pueden crear nuevas clases partiendo de una clase o de una jerarquía de clases preexistente (ya comprobadas y verificadas) evitando con ello el rediseño, la modificación y verificación de la parte ya implementada. La herencia facilita la creación de objetos a partir de otros ya existentes e implica que una subclase obtiene todo el comportamiento (métodos) y eventualmente los atributos (variables) de su superclase.
Es la relación entre una clase general y otra clase más especifica. Por ejemplo: Si declaramos una clase párrafo derivada de una clase texto, todos los métodos y variables asociadas con la clase texto, son automáticamente heredados por la subclase párrafo.
La herencia es uno de los mecanismos de los lenguajes de programación orientada a objetos basados en clases, por medio del cual una clase se deriva de otra de manera que extiende su funcionalidad. La clase de la que se hereda se suele denominar clase base, clase padre, superclase, clase ancestro (el vocabulario que se utiliza suele depender en gran medida del lenguaje de programación).
En los lenguajes que cuentan con un sistema de tipos fuerte y estrictamente restrictivo con el tipo de datos de las variables, la herencia suele ser un requisito fundamental para poder emplear el Polimorfismo, al igual que un mecanismo que permita decidir en tiempo de ejecución qué método debe invocarse en respuesta a la recepción de un mensaje, conocido como enlace tardío (late binding) o enlace dinámico (dynamic binding).

Ejemplo en Java.

public class Mamifero{
    private int patas;
    private String nombre;
    public void imprimirPatas(){
      JOptionPane.showMessageDialog(null," Tiene " + patas + " patas\n","Mamifero",
                                    JOptionPane.INFORMATION_MESSAGE);
    }
    public Mamifero(String nombre, int patas){
      this.nombre = nombre;
      this.patas = patas;
    }
  }
 
  public class Perro extends Mamifero {
    public Perro(String nombre){
      super(nombre, 4);
    }
  }
 
  public class Gato extends Mamifero {
    public Gato(String nombre){
      super(nombre, 4);
    }
  }
 
  public class CrearPerro {
    public static void main(String [] args) {
      Perro perrito = new Perro("Pantaleon");
      perrito.imprimirPatas();   /*Está en la clase mamífero*/
    }
  }