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