Conviértete en un emprendedor,profesional del conocimiento en la programación

lunes, 9 de enero de 2012

POLIMORFISMO

Compartir con:


POLIMORFISMO

Clases Abstractas. Casting

Polimorfismo

Es una de las características fundamentales para cualquier lenguaje orientado a Objetos, La derivación de su significado: Poli = Múltiple, morfismo= Formas, implica que Objetos de la misma clase pueden tomar diversas formas de comportamiento.



El poder manipular un Objeto como si éste fuera de un tipo genérico otorga mayor flexibilidad al momento de programar con Objetos. Observe el siguiente fragmento de código:
                           
                               Figura a = new Circulo();
                               Figura b = new Triangulo();

Los objetos a y b siendo de la misma clase Figura, se comportan como clases diferentes: Circulo y Triángulo.

Clases Abstractas.

Son clases Padre donde se consideran métodos que aún no se conoce su desarrollo. Recién se conocerá en alguna clase Hija. A estos métodos se les conoce como métodos abstractos y utilizan la palabra reservada abstract para su identificación.

Cuando una Clase Padre contiene por lo menos un método abstracto se le conoce como Clase Abstracta y también debe estar precedía por la palabra reservada abstract.

Estas clases pueden tener además métodos no abstractos que invoquen a métodos abstractos si lo necesitan para definir un comportamiento. Sin embargo, no se puede instanciar objetos invocando al constructor de la clase base abstracta.

Las clases Hija deben desarrollar todos los métodos abstractos de la clase Padre. Además, la clase Hija puede redefinir cualquier método de la clase Padre, con el mismo nombre. Incluso pueden utilizar la palabra reservada super para referirse a cualquier método del mismo nombre que esté definido en la clase Padre.

En el funcionamiento del polimorfismo se puede identificar el concepto de “enlace tardío” que consiste en que recién se conocerá el método a ejecutar en el momento de la ejecución, más no en la compilación.

Uso de "Casting"

El término "Casting" viene de la palabra "Cast" que significa Molde, por lo que el término literal es Hacer un Molde. En Polimorfismo se lleva a cabo este proceso de "Casting" implícitamente, una Guitarra se coloca en el molde de un Instrumento, un Triángulo en el molde de una Figura. Sin embargo, en ciertas ocasiones se requiere realizar un tipo de "Casting" que no es considerado seguro en términos computacionales.

Anteriormente se mencionó que el "Casting" llevado a cabo con Polimorfismo es implícito, esto se debe a que no se requiere de sintaxis especial, simplemente se convierte una Guitarra a un Instrumento. Sin embargo, para llevar una transformación en sentido opuesto se requiere de sintaxis adicional para mantener la seguridad de transformación; analicemos: mientras se puede asegurar que un Triángulo es una Figura ("Up-Casting"), una Figura no necesariamente es un Triángulo, claro está que lo puede ser, pero en Java se requiere definir explícitamente esta operación ("Down-Casting").


Ejemplo 1

Diseñe una clase abstracta de nombre Figura que tenga un atributo protegido para el nombre de la figura, métodos get-set, métodos abstractos para el area() y el perimetro() y un método no abstracto que retorne la información correspondiente al nombre, area y perímetro de cualquier figura.

Luego diseñe una clase hija de nombre Circulo que herede a la clase Figura que tenga un atributo par a el radio, constructor, métodos get-set y desarrollo de los métodos abstractos de la clase padre.

También diseñe una clase hija de nombre Cuadrado que herede a la clase Figura que tenga un atributo para el lado, constructor, métodos get-set, y desarrollo de los métodos abstractos de la clase padre.

Finalmente, diseñe una clase de nombre Panel Principal con la interface necesaria para crear objetos de diferente figura.

Diseño de la clase abstracta Figura:

     public abstract class Figura{
          protected String nombre;
          public Figura(String nombre){  
           this.nombre=nombre; }

    public abstract double area();
    public abstract double perimetro();
    public String info(){
            return "Figura\t: "+nombre+"\n"+
                       "Area\t: "+ area()+"\n"+
                        "Perímetro\t: "+perimetro();
            }
}

     Diseño de la clase Circulo:
          public class Circulo extends Figura{
           protected double radio;
           public Circulo(double radio){
                    super("Circulo");
                    this.radio = radio;
            }

          public double area(){     return Math.PI * radio * radio;}
          public double perimetro(){  return 2 * Math.PI * radio;}
}

  Diseño de la clase Cuadrado
        public class Cuadrado extends Figura{
            protected double lado;
            public Cuadrado(double lado){
                  super("Cuadrado");
                  this.lado = lado;
      }
      public double area(){ return lado * lado;}
      public double perimetro(){ return 4*lado;}
 }

Programación del botón Nuevo Circulo:{
       Figura a = new Circulo(leeRadio());
       lista(a); }

Programación del botón Nuevo Cuadrado:{
        Figura b = new Cuadrado(leeLado());
         lista(b);    }

 public void lista(Figura f){
     imprime(f.info());            }

Observe el parámetro del método lista() y compruebe la compatibilidad entre la invocación del método y su desarrollo.







0 comentarios:

Publicar un comentario