Semana 12
Poliformismo.
herencia. El polimorfismo nos permite “programar en forma general ”, en vez de “programar en forma específica”. En particular, nos permite escribir programas que procesen objetos que compartan la misma superclase (ya sea de manera directa o indirecta) como si todos fueran objetos de la superclase; esto puede simplificar la programación.
Con el polimorfismo podemos diseñar e implementar sistemas que puedan extenderse con facilidad, ya que se pueden agregar nuevas clases con sólo modificar un poco (o nada) las porciones generales del programa, siempre y cuando las nuevas clases sean parte de la jerarquía de herencia que el programa procesa en forma genérica. Las nuevas clases simplemente “se integran”. Las únicas partes de un programa que deben alterarse son las que requieren un conocimiento directo de las nuevas clases que agregamos a la jerarquía.
Algunas veces, cuando se lleva a cabo el procesamiento polimórfico, es necesario programar “en forma específica”. Nuestro ejemplo práctico, demuestra que un programa puede determinar el tipo de un objeto en tiempo de ejecución, y actuar sobre él de manera acorde.
Clases y métodos abstractos.
Cuando pensamos en un tipo de clase, asumimos que los programas crearán objetos de ese tipo. En algunos casos es conveniente declarar clases (conocidas como clase abstractas) para las cuales el programador nunca creará instancias de objetos. Puesto que sólo se utilizan como superclases en jerarquías de herencia, nos referimos a ellas como superclases abstractas. Estas clases no pueden utilizarse para instanciar objetos ya que, como veremos pronto, las clases abstractas están incompletas. Las subclases deben declarar las “piezas faltantes” para convertirse en clases “concretas”, a partir de las cuales podemos instanciar objetos. De lo contrario, estas subclases también serán abstractas.
El propósito de una clase abstracta es proporcionar una superclase apropiada, a partir de la cual puedan heredar otras clases y, por ende, compartir un diseño común.
No todas las jerarquías contienen clases abstractas. Sin embargo, a menudo los programadores escriben código cliente que utiliza sólo tipos de superclases abstractas para reducir las dependencias del código cliente en un rango de tipos de subclases. Por ejemplo, un programador puede escribir un método con un parámetro de un tipo de superclase abstracta. Cuando es llamado, ese método puede recibir un objeto de cualquier clase concreta que extienda en forma directa o indirecta a la superclase especificada como el tipo
del parámetro.
Para hacer una clase abstracta, ésta se declara con la palabra clave abstract. Por lo general, esta clase contiene uno o más métodos abstractos. Un método abstracto es un método de instancia con la palabra clave abstract en su declaración, como en
public abstract void dibujar(); // método abstracto
Los métodos abstractos no proporcionan implementaciones. Una clase que contiene uno o más métodos abstractos debe declararse de manera explícita como abstract, aun si esa clase contiene métodos concretos (no abstractos). Cada subclase concreta de una superclase abstracta también debe proporcionar implementaciones concretas de cada uno de los métodos abstractos de la superclase. Los constructores y los métodos static no pueden declararse como abstract. Los constructores no se heredan, por lo que nunca podría implementarse un constructor abstract. Aunque los métodos static que no son private se heredan, no pueden sobrescribirse. Como el propósito de los métodos abstract es sobrescribirlos para procesar objetos con base en sus tipos, no tendría sentido declarar un método static como abstract.
Uso de clases abstractas para declarar variables.
Aunque no podemos instanciar objetos de superclases abstractas, pronto veremos que podemos usar superclases abstractas para declarar variables que puedan guardar referencias a objetos de cualquier clase concreta que se derive de esas superclases abstractas. Por lo general, los programas utilizan dichas variables para manipular los objetos de las subclases mediante el polimorfismo. Además, podemos usar los nombres de las superclases abstractas para invocar métodos static que estén declarados en esas super clases abstractas.
Ejemplos.
Principal
package eje1_poliformismo;
import java.util.Scanner;
/**
*
* @author angel
*/
public class Eje1_Poliformismo {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// Principal
double B, b, h, A=0;
Scanner in=new Scanner(System.in);
System.out.println("Ingrese base mayor ");
B=in.nextDouble();
System.out.println("Ingrese base menor ");
b=in.nextDouble();
System.out.println("Ingrese altura ");
h=in.nextDouble();
Romboide calcula=new Romboide(b, h, A);
calcula.calcular();
calcula.imprimir();
calcula=new Triangulo(b, h, A);
calcula.calcular();
calcula.imprimir();
calcula=new Trapecio(B,b,h, A);
calcula.calcular();
calcula.imprimir();
}
}
Clases.
Romboide
package eje1_poliformismo;
/**
*
* @author angel
*/
public class Romboide {
protected double b;
protected double h;
protected double A;
public Romboide(double b, double h, double A) {
this.b = b;
this.h = h;
this.A = A;
}
public double getB() {
return b;
}
public double getH() {
return h;
}
public double getA() {
return A;
}
public double calcular(){
A=b*h;
return A;
}
public void imprimir(){
System.out.println("Base "+b + "\nAltura "+h +"\nArea del Romboide "+A);
}
}
Trapecio.
package eje1_poliformismo;
/**
*
* @author angel
*/
public class Trapecio extends Romboide{
private double B;
public Trapecio(double B, double b, double h, double A) {
super(b, h, A);
this.B = B;
}
@Override
public double calcular(){
A=((B+b)*h)/2;
return A;
}
@Override
public void imprimir(){
System.out.println("Base mayor "+B+"\nBase "+b + "\nAltura "+h +"\nArea del Trapecio "+A);
}
}
Triangulo
package eje1_poliformismo;
/**
*
* @author angel
*/
public class Triangulo extends Romboide {
public Triangulo(double b, double h, double A) {
super(b, h, A);
}
@Override
public double calcular(){
A=b*h/2;
return A;
}
@Override
public void imprimir(){
System.out.println("Base "+b + "\nAltura "+h +"\nArea del Triangulo "+A);
}
}
Video de Referencia
Comentarios
Publicar un comentario