É correto sobrescrever métodos com Polimorfismo

9 respostas
M

Por exemplo:

package Herança;

public abstract class Animal {
	
	protected int serial;
	double peso;

		
	void dormir() {
		System.out.println("Dormiu");
	}
	
	abstract void fazerBarulho();

	abstract void comida();
}
package Herança;

public class Cachorro extends Animal {
	
	void fazerBarulho() {
		System.out.println("Au, Au !");
	}
	void comida() {
		System.out.println("Ração");
	}
}
package Herança;

public class Galinha extends Animal {

	void fazerBarulho() {
		System.out.println("Có, Có !");
	}
	void comida() {
		System.out.println("Milho");
	}
}
package Herança;

public class AnimalTest {
	
	public static void barulho(Animal animal) {
		animal.fazerBarulho();
	}
	public static void comida(Animal animal) {
		animal.comida();
	}
	
	public static void main(String[] args) {
		
		Animal titi = new Galinha();	
		Animal toto = new Cachorro();
		Animal carijo = new Galinha();
		Animal pitbull = new Cachorro();
		
		comida(titi);
		comida(toto);
		comida(carijo);
		comida(pitbull);		
	}

}

9 Respostas

Rodrigo_Sasaki

Não entendi a sua dúvida.

No caso acima você não tem escolha, tem que sobrescrever os métodos abstratos da superclasse.

M

Então, falando com um amigo no skype, ele fez a mesma coisa que eu só que ele usou os if, else
qual é o melhor tipo de uso, if e else ou usar polimorfismo?

Natalia_Lima

Então cara, é que sua classe e os métodos são abstratos, então vc obrigatoriamente precisa implementálos se a sua classe filha for concreta. Quando herdamos de uma classe abstrata que possui metodos abstratos, temos que escolher entre implementar o método ou também ser uma classe abstrata.
Pense que métodos abstratos herdados são responsabilidades herdadas, vc nao podera ser um objeto concreto enquanto tiver responsabilidades a serem tratadas.

Então, neste caso vc não está sobrescrevendo, mas sim, implementando…

M

Obrigado …

Rodrigo_Sasaki

public static void barulho(Animal animal) { if(animal instanceof Cachorro){ ((Cachorro)animal).fazerBarulho(); }else if(animal instanceof Galinha){ ((Galinha)animal).fazerBarulho(); } } Ele fez algo assim? Se é isso com certeza a sua solução é melhor.

Natalia_Lima

:wink:

ViniGodoy

Você deve sempre preferir polimorfismo ao if ou switch. Inclusive, “substituir switch por polimorfismo” é uma das refatorações do catálogo do Martin Fowler.

Switchs e ifs tendem a se espalhar pelo código. No seu caso, por exemplo, ficaria bem mais difícil para seu amigo adicionar mais um bicho, do que para você.

M

.

M

Obrigado Vini, era isso mesmo que eu esperava como resposta.

Criado 12 de julho de 2012
Ultima resposta 12 de jul. de 2012
Respostas 9
Participantes 4