Olá! Hoje estamos finalizando uma série de palestras sobre os princípios da OOP . Nesta lição falaremos sobre polimorfismo. Polimorfismo é a capacidade de tratar vários tipos como se fossem do mesmo tipo. Neste caso, o comportamento dos objetos será diferente dependendo do tipo a que pertencem. Vejamos esta afirmação com mais detalhes. Vamos começar com a primeira parte: “a capacidade de trabalhar com vários tipos como se fossem do mesmo tipo”. Como podem diferentes tipos ser um e o mesmo? Parece um pouco estranho:/ Na verdade é simples. Por exemplo, esta situação surge com o uso normal da herança. Vamos ver como isso funciona. Digamos que temos uma classe pai simples
Quando esta “generalização” não é necessária, e pelo contrário necessitamos que o comportamento das espécies seja diferente, cada tipo comporta-se de forma diferente. Graças ao polimorfismo, você cria uma interface única (conjunto de métodos) para uma ampla variedade de classes. Devido a isso, a complexidade dos programas é reduzida. Mesmo que expandíssemos o programa para 40 tipos de gatos, ainda teríamos a interface mais simples possível – um método
Cat
com um único método run()
- “run”:
public class Cat {
public void run() {
System.out.println("Бег!");
}
}
Agora vamos criar três classes que herdam de Cat
: Lion
, Tiger
e Cheetah
, denotando leão, tigre e chita.
public class Lion extends Cat {
@Override
public void run() {
System.out.println("Лев бежит со speedю 80 км/ч");
}
}
public class Tiger extends Cat {
@Override
public void run() {
System.out.println("Тигр бежит со speedю 60 км/ч");
}
}
public class Cheetah extends Cat {
@Override
public void run() {
System.out.println("Гепард бежит со speedю до 120 км/ч");
}
}
Então temos 3 aulas. Vamos simular uma situação onde podemos trabalhar com eles como se fossem da mesma classe. Imaginemos que um dos nossos gatos está doente e precisa da ajuda do Dr. Aibolit. Vamos tentar criar uma classe Aibolit
que seja capaz de tratar leões, tigres e chitas.
public class Aibolit {
public void healLion(Lion lion) {
System.out.println("Лев здоров!");
}
public void healTiger(Tiger tiger) {
System.out.println("Тигр здоров!");
}
public void healCheetah(Cheetah cheetah) {
System.out.println("Гепард здоров!");
}
}
Parece que o problema está resolvido - a classe está escrita e pronta para uso. Mas o que faremos se quisermos expandir nosso programa? Agora temos apenas 3 espécies: leões, tigres e chitas. Mas existem mais de 40 espécies de gatos no mundo. Imagine o que acontecerá se adicionarmos ao programa aulas separadas para gatos de Pallas, onças, Maine Coons, gatos domésticos e todos os outros. O programa em si, é claro, funcionará, mas a classe Aibolit
terá que adicionar constantemente novos métodos para tratar cada tipo de gato e, como resultado, crescerá para tamanhos sem precedentes. É aqui que entra em jogo a propriedade do polimorfismo - “a capacidade de trabalhar com vários tipos como se fossem do mesmo tipo”. Não precisamos criar inúmeros métodos que farão a mesma coisa – tratar o gato. Um método será suficiente para todos os casos ao mesmo tempo:
public class Aibolit {
public void healCat(Cat cat) {
System.out.println("Пациент здоров!");
}
}
healCat()
Podemos passar objetos Lion
e Tiger
objetos para o método Cheetah
- eles são todos Cat
:
public class Main {
public static void main(String[] args) {
Aibolit aibolit = new Aibolit();
Lion simba = new Lion();
Tiger sherekhan = new Tiger();
Cheetah chester = new Cheetah();
aibolit.healCat(simba);
aibolit.healCat(sherekhan);
aibolit.healCat(chester);
}
}
Saída do console:
Пациент здоров!
Пациент здоров!
Пациент здоров!
É assim que nossa classe Айболит
pode trabalhar com tipos diferentes como se fossem do mesmo tipo. Agora vamos tratar da segunda parte: “neste caso, o comportamento dos objetos será diferente dependendo do tipo a que pertencem”. Tudo é simples aqui também. Na natureza, todos os gatos funcionam de maneira diferente. No mínimo, a velocidade de corrida é diferente. Entre os nossos três animais de estimação, a chita é a mais rápida, enquanto o tigre e o leão correm mais devagar. Ou seja, o comportamento deles é diferente. O polimorfismo não nos dá apenas a capacidade de usar diferentes tipos como um só. Ao mesmo tempo, permite-nos não esquecer as suas diferenças e preserva o comportamento específico de cada um deles. Isso pode ser entendido com este exemplo. Digamos que após uma recuperação bem-sucedida, nossos gatos decidiram correr um pouco para comemorar. Vamos adicionar isso à nossa classe Aibolit
:
public class Aibolit {
public void healCat(Cat cat) {
System.out.println("Пациент здоров!");
cat.run();
}
}
Vamos tentar executar o mesmo código para tratar três animais:
public static void main(String[] args) {
Aibolit aibolit = new Aibolit();
Lion simba = new Lion();
Tiger sherekhan = new Tiger();
Cheetah chester = new Cheetah();
aibolit.healCat(simba);
aibolit.healCat(sherekhan);
aibolit.healCat(chester);
}
E o resultado será assim:
Пациент здоров!
Лев бежит со speedю 80 км/ч
Пациент здоров!
Тигр бежит со speedю 60 км/ч
Пациент здоров!
Гепард бежит со speedю до 120 км/ч
Aqui vemos claramente que o comportamento específico dos nossos objetos foi preservado, embora tenhamos passado todos os três animais para um método, “generalizando” cada um deles para Cat
. Graças ao polimorfismo, Java lembra perfeitamente que não se trata apenas de três gatos, mas sim de um leão, um tigre e uma chita, que correm de maneira diferente. Esta é a principal vantagem do uso da flexibilidade do polimorfismo . Quando precisamos criar alguma funcionalidade comum a vários tipos, leões, tigres e chitas simplesmente se transformam em “gatos”. Todos os animais são diferentes, mas em algumas situações - um gato é um gato, não importa a que espécie pertença :) Aqui está uma confirmação em vídeo para você.
run()
para todos os 40 gatos.
GO TO FULL VERSION