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?