sábado, 19 de mayo de 2012

Polimorfismo con clase abstracta



Diagrama de clase: https://docs.google.com/open?id=0B70n-hF_J9PubFpqODJZTzlKQnM




CON CASTING EXPLICITO

Figura.java


public abstract class Figura {

   protected String nombre;
   protected int color;
   protected int grosorBorde;

   public Figura(String nombre, int color, int grosorBorde) {
      this.nombre = nombre;
      this.color = color;
      this.grosorBorde = grosorBorde;
   }

    public abstract void dibujar();
}

Figura2D.java

public abstract class Figura2D extends Figura{

    public Figura2D(String nombre, int color, int grosorBorde) {
        super(nombre, color, grosorBorde);
    }

    public abstract int calculoArea();
    public abstract int calculoPerimetro();

}

Cuadrado.java

public class Cuadrado extends Figura2D{

    private int lado;

    public Cuadrado(String nombre, int color, int grosorBorde, int lado) {
        super(nombre, color, grosorBorde);
        this.lado = lado;
    }

    public int getLado() {
        return lado;
    }

    public void cambiarTamano(int escala){
        lado *= escala;
    }

    public int calculoArea() {
        return (int)(Math.pow(lado, 2.0));
    }

    public int calculoPerimetro(){
        return lado*4;
    }

    public void dibujar(){
        System.out.println("Dibujo Cuadrado");
    }

}

Triangulo.java

public class Triangulo extends Figura2D{

    private int base;
    private int altura;

    public Triangulo(String nombre, int color, int grosorBorde, int base, int altura) {
        super(nombre, color, grosorBorde);
        this.base = base;
        this.altura = altura;
    }

     public void cambiarTamano(int escala){
        base *= escala;
        altura *= escala;
    }

    public int calculoArea() {
        return (int)(base*altura/2);
    }

    public int calculoPerimetro(){
        return base*3; //Supongo es equilatero
    }

    public void dibujar(){
        System.out.println("Dibujo Triangulo");
    }

}

Circulo.java

public class Circulo extends Figura2D{

    private int radio;

    public Circulo(String nombre, int color, int grosorBorde, int radio) {
        super(nombre, color, grosorBorde);
        this.radio = radio;
    }

    public void cambiarTamano(int escala){
        radio *= escala;
    }

    public int calculoArea() {
        return (int)(Math.PI * Math.pow(radio,2.0));
    }

    public int calculoPerimetro(){
        return (int)(2 * Math.PI * radio); //Supongo es equilatero
    }
   
     public void dibujar(){
        System.out.println("Dibujo Circulo");
    }

}


Figura3D.java

public abstract class Figura3D extends Figura{

    public Figura3D(String nombre, int color, int grosorBorde) {
        super(nombre, color, grosorBorde);
    }
   
    public abstract int calcularVolumen();

}


Esfera.java

public class Esfera extends Figura3D{
   
    public int radio;

    public Esfera(String nombre, int color, int grosorBorde, int radio) {
        super(nombre, color, grosorBorde);
        this.radio = radio;
    }

    public int calcularVolumen(){
        return (int)(4/3 * Math.PI * Math.pow(radio, 2));
    }
   
    public void dibujar(){
        System.out.println("Dibujo Esfera");
    }
}


Cubo.java

public class Cubo extends Figura3D{

    private Cuadrado cuad;

    public Cubo(String nombre, int color, int grosorBorde, Cuadrado cuad) {
        super(nombre, color, grosorBorde);
        this.cuad = cuad;
    }

    public Cuadrado getCuad() {
        return cuad;
    }

    public int calcularVolumen(){
        return (int)(Math.pow(cuad.getLado(), 2));
    }

    public void dibujar(){
        System.out.println("Dibujo Cubo");
    }

}

Piramide.java

public class Piramide extends Figura3D{

    private Triangulo tri;
    public int altura;

    public Piramide(String nombre, int color, int grosorBorde, Triangulo tri, int altura) {
        super(nombre, color, grosorBorde);
        this.tri = tri;
        this.altura = altura;
    }
  
    public int calcularVolumen(){
        return (int)(tri.calculoArea()*altura);
    }

    public void dibujar(){
        System.out.println("Dibujo Piramide");
    }
}


Main.java

public class Main {

    public static void main(String[] args) {

        Figura [] miVector = new Figura[2];

        miVector[0] = new Cuadrado("a",1,2,3);
        miVector[1] = new Cubo("b",4,5, new Cuadrado("c",6,7,8));

        /* Aqui no hay problema porque  dibujar() esta implementada
        en todas las clases concretas */
        miVector[0].dibujar();

        /* Este llamado permite ver la parte generica de miVector[0],
        es decir, no puedo acceder a calculoArea() aunque esta implementada
        en Cuadrado*/
        System.out.println("Area = " + miVector[0]);

        /*La solución es hacer casting */
        System.out.println("Area = " + ((Cuadrado)miVector[0]).calculoArea());
        System.out.println("Volumen = " + ((Cubo)miVector[1]).calcularVolumen());
    }

Cómo calcularías el área de la base de una piramide que se almacene en la posición 2 del arreglo miVector?

No hay comentarios:

Publicar un comentario

Muchas gracias por su comentario, será revisado y pronto se publicará.