Heranças e Interfaces

Estou com uma dúvida no código abaixo, está dando erro no seguinte:

Crio um array de objetos do tipo Shape[] e depois preencho ele com objetos de outros tipos, um array de shapes com figuras como retangulo, circulo etc, ateh aih funcionava, mas agora coloquei uma interface CenteredShape e outra classe CenteredRectangle e não esta funcionando:

[code]

public abstract class Shape
{
public abstract double area();
public abstract double total();
}

public class Rectangle extends Shape
{
protected double w,h;

public Rectangle (double w, double h) // construtor
{
	this.w=w; this.h=h;
}
public double getWidth() // acessador
{
	return w;
}
public double getHeigth() // acessador
{
	return h;
}
public double area () // implementa o abstrato
{
	return (w*h);
}
public double total() // perimetro
{
	return (2*(w+h));
}

}

public interface CenteredShape
{
public void setCenter (double x, double y);
public double getCenterX ();
public double getCenterY ();
}

public class CenteredRectangle extends Rectangle
implements CenteredShape
{
// atributos
private double cx, cy;

// metodos
// construtor
public CenteredRectangle (double cx, double cy, double w, double h)
{
	super(w,h);
	this.cx = cx; this.cy = cy;
}
// modificador
public void setCenter (double x, double y)
{
	cx = x; cy = y;
}
// acessadores
public double getCenterX ()
{
	return cx;
}
public double getCenterY ()
{
	return cy;
}

}

public class PrincipalCentered
{
public static void main(String[] args)
{
Shape[] figura = new Shape[1]; // cria array
figura[0] = new CenteredRectangle(0.5, 1.5, 1.0, 3.0);

	// Saida
	System.out.println
		("Centro Rectangle: "+figura[0].getCenterX()+
		 " e "+figura[0].getCenterY()); // erro aqui ! ! !
}

}

Valeu. :smiley:
Rafael.[/code]

Vc esta fazendo um array de Shape e tentando acessar métodos de retorno, no caso os getCenterX e getCenterY da classe CenteredRectangle.

Na superclasse, no caso Shape, os métodos que vc tenta acessar tem que estar nela tb.
Tente colocar em Shape os métodos:

public abstract double getCenterY();
public abstract double getCenterX();

Vai funcionar.

Nao vai funcionar pq o teu array eh do tipo Shape, o qual nao contem os metodos que vc esta tentando chamar. Para funcionar, voce precisa fazer cast para o tipo correto. No main, mude para isso:

// Saida
System.out.println
         ("Centro Rectangle: "+((CenteredShape)figura[0]).getCenterX()+
          " e "+ ((CenteredShape)figura[0]).getCenterY()); 

Note o cast para CenteredShape

Rafael

Funcionou com o cast, o outro jeito, colocando os metodos como abstract na classe shape naum funcionava, eu jah tinha testado, dava erro pq a classe rectangle precisaria ter tb os metodos por herdar da classe abstract shape.
Valeu,
Abs,
Rafael. 8)

ooops… eh verdade :oops: