(RESPONDIDO) Polimorfismo básico

2 respostas
NewScript

Ola, antes de tudo, obrigado pela atenção. Vi vários post relacionado a polimorfismo mas nenhum me respondeu porque o meu código não funciona. Este é apenas um teste, estou começando em java...

Criei uma classe Shape que será a superclasse de Triangule, Circle, Square e Amoeba.

Classe Shape :

public class Shape {
	public void rotate(){
		System.out.println("Shape rotate");
	}
	public void playSound(){
		System.out.println("Shape sound");
	}
}

Classe Circle:

public class Circle extends Shape {
	private String nome = "Circle";
	public String getNome() {
		return nome;
	}
}

As classes [color=blue]Square[/color] e [color=blue]Triangule[/color] tem o mesmo código da classe Circle, mudando é claro, o nome de cada figura.

Classe Amoeba (Esta sobrepõe os métodos de Shape):

public class Amoeba extends Shape {
	private String nome = "Amoeba";
	public String getNome() {
		return nome;
	}
	public void rotate() {
		System.out.println("Amoeba rotate");
	}
	public void playSound() {
		System.out.println("Amoeba sound");
	}
}

Em minha classe teste (a que tem o main), fiz da seguinte forma:

Shape square = new Square();
		Shape triangule = new Triangule();
		Shape circle = new Circle();
		Shape amoeba = new Amoeba();

System.out.println(triangule.getNome());

Porém [color=blue].getNome[/color] não é encontrado como método de triangule. Alias, não consegui acessar nada de nenhum deles (triangule, circle, square ou amoeba). Só funciona se eu não usar o [color=blue]Shape[/color] como tipo, assim: [color=blue]Square square = new Square()[/color];

Tentei também desta forma:

Shape[] shape = new Shape[4];
		shape[0] = new Square();
		shape[1] = new Triangule();
		shape[2] = new Circle();
		shape[3] = new Amoeba();
		
		System.out.println(shape[0].getNome);

Não funcionou também. Não consigo ver o erro... Se alguém puder me dar uma luz... Vi alguns exemplos pela net mas mesmo assim não sei onde está o erro. Sei... é vergonhoso...

2 Respostas

S

Simples, você só pode invocar os metodos que estão declarados em Shape (caso você invoque o método de uma variável de referencia do tipo Shape, não importando se ele faz referencia a um objeto do tipo Triangle).

Lembrando que só podem ser chamados os metodos que estejam visiveis. Ou seja, apenas metodos do public, protected e default (SE Shape e Triangle estiverem no mesmo pacote).

NewScript

Valeu colega Sem_nome. Mudei a classe Shape e ficou tudo resolvido. Obrigado

A Shape ficou assim:

public class Shape { private String nome = "Shape"; public String getNome() { return nome; } public void rotate(){ System.out.println("Shape rotate"); } public void playSound(){ System.out.println("Shape sound"); } }

:oops:

Criado 28 de março de 2013
Ultima resposta 29 de mar. de 2013
Respostas 2
Participantes 2