Agora que você domina completamente os conceitos de herança, polimorfismo e abstração, vamos aos exemplos práticos - códigos em Java.
Vamos mostrar como é possível uma superclasse abstrata manipule suas subclasses concretas.
Superclasse abstratas se tornando subclasses concretas
Uma poderosa arma do polimorfismo e abstração em Java é a capacidade que temos de manipular as subclasses através de uma superclasse.
Como cada subclasse concreta foi criada com métodos diferentes, elas agirão de forma diferente, conforme vimos em nossos tutoriais sobre polimorfismo em Java.
Isso nos dá um incrível poder e versatilidade, afinal podemos usar qualquer objeto que seja uma subclasse de nossa classe abstrata.
Vamos usar o exemplo de nosso tutorial sobre Polimorfismo, Classes e Métodos Abstratos: o exemplo dos animais.
Através da classe abstrata "Animal", criamos 3 objetos: uma vaca, um gato e um carneiro.
Vamos fazer a classe "Animal" receber uma referência de cada um desses objetos e invocar seu método 'som()', que é abstrato e age de forma diferente em cada subclasse.
Ou seja, vamos manipular polimorficamente os animais.
Começamos essa manipulação ao fazer com que um Array de "Animal" receba os objetos da classe "Vaca", "Gato" e "Carneiro":
Animal bichos[] = {mimosa, bichano, barnabe};
Depois, fazemos com que um objeto da classe "Animal", o 'animal' tenha uma referência para cada um desses objetos (mimosa, bichano e barnabé):
for(Animal animal : bichos)
{
System.out.print("Esse animal é da classe " + animal.getClass().getName() + " e faz ");
animal.som();
System.out.println();
}
Note como ficou simples chamar todos as subclasses da classe abstrata "Animal", fazendo com que o objeto 'animal' receba cada um dos tipos ("Vaca", "Gato" e "Carneiro") !
Imagine se fosse uma aplicação real, de um game, com dezenas ou centenas de animal, que a cada 3 segundos tivessem que fazer seu som?
Imagine a trabalheira que seria invocar o método de cada objeto desse?
Agora você já sabe que é melhor manipular polimorficamente cada objeto que é subclasse da classe abstrata!
Aproveitamos também para mostrar a utilidade de se saber os métodos da classe Object. No caso, usamos o método getClass(), que retorna 'classe NomeDaClasse' e o método getName() que retorna só o 'NomeDaClasse'
Código Java de como manipular polimorficamente as subclasses
-->zoo.java
public class zoo {
public static void main(String[] args) {
Vaca mimosa = new Vaca();
Gato bichano = new Gato();
Carneiro barnabe = new Carneiro();
Animal bichos[] = {mimosa, bichano, barnabe};
for(Animal animal : bichos)
{
System.out.print(animal.nome + " é da classe " + animal.getClass().getName() + ", tem " + animal.numeroPatas + " patas e faz ");
animal.som();
System.out.println();
}
}
}
-->Animal.java
public abstract class Animal {
protected String nome;
protected int numeroPatas;
public abstract void som();
}
-->Vaca.java
public class Vaca extends Animal {
public Vaca(){
this.nome = "Mimosa";
this.numeroPatas = 4;
}
@Override
public void som(){
System.out.print("MUUUU");
}
}
-->Gato.java
public class Gato extends Animal{
public Gato(){
this.nome = "Bichano";
this.numeroPatas = 4;
}
@Override
public void som(){
System.out.print("MIAU");
}
}
-->Carneiro.java
public class Carneiro extends Animal{
public Carneiro(){
this.nome = "Banabé";
this.numeroPatas = 4;
}
@Override
public void som(){
System.out.print("BÉÉÉ");
}
}
4 comentários:
não entendi esse laço for:
for(Animal animal : bichos){...}
no for vc precisa definir os limites e um "contador" não?
parabéns pelo site, muito bem explicado!
Olá Tedesco,
Esse laço for é um laço especial para arrays.
Já falamos sobre ele no Tutorial:
Laço for para Arrays, for each, for enhanced ou laço for avançado
Muito bom, aprendendo muito com o Java Progressivo, melhor que encontrei na internet até agora.
Gostaria muito que tivesse um PHP Progressivo.
`Parabéns
Realmente ótimo esse site!!!
Postar um comentário