3
respostas

Mais exemplos de Polimorfismo e Abstract

Otimas aulas ,gostaria de mais alguma explicação sobre polimorfismo e classes abstratas, pois estou com duvidas .

3 respostas

Boa tarde José, vou tentar esclarecer com exemplos bem simples!

Classe abstrata pode ser uma classe que será Pai, isto é, vão herdar dela(métodos e atributos) mas que não queremos instanciar. Um bom exemplo seria a classe Animal. Todo animal deve comer, então podemos colocar o método comer() para não precisarmos implementar em todas as classes de animais, porém não queremos instanciar um Animal, pois se pensarmos apenas em "O animal comeu", estamos falando de qual animal? por isso não devemos criar objetos animal, deixando assim esta classe privada.

Já o Polimorfismo é a capacidade de um objeto ser representado por mais de um tipo de variável (que tenha relação de herança ou implementação), por exemplo, Temos a Classe Cao que herdou de Animal, logo podemos ter:

Cao cao = new Cao();
Animal cao2 = new Cao();

Se criarmos uma classe Gato que também herda de Animal teremos:

Gato g = new Gato();
Animal gato = new Gato();

Como vantagem, podemos ter um método que receba (Animal animal) e podemos passar qualquer classe que herda de Animal!

Espero ter ajudado.

Sei que isso foi falado algumas vezes, mas não consegui entender claramente. Qual a necessidade de dar new Gato uma vez que estamos nos referindo a Animal? Porque não usar o new Animal?

Leandro, um Gato herda de animal, mas pode ter comportamentos e estados específico, um gato pode ter o comportamento de ronronar, e o estado boolean ronronando = false, mas não é todo Animal que ronrona. Por isso você precisa dar um new Gato e não new Animal.

Mas caso eu não precise usar o comportamento mais específico de ronronar, caso eu só precise que o Animal coma, eu poderia utilizar o polimorfismo e guardar o objeto Gato numa variável de tipo Animal, dessa maneira ficaria fácil de chamar o método comer em um Animal, por exemplo, em um outro método eu preciso receber um animal qualquer e fazê-lo comer(), no parâmetro do método eu preciso dizer qual o tipo da variável que estou recendo:

void digere(Animal animal) {
    animal.come();
    animal.evacua();
}

Recebendo um tipo mais genérico (Animal) fica fácil executar a ação pra qualquer objeto que estenda esta classe.