O que é polimorfismo? E por que vale a pena aprender

Se você pode dirigir um carro suburbano de 4 portas, também pode dirigir uma caminhonete. Se você dirigiu um carro com motor a combustão, também pode dirigir um carro elétrico.

A forma e o tamanho dos veículos de passageiros podem ser diferentes de um para o outro. O motor que move esses veículos também pode ser completamente diferente. Mas isso não importa para o motorista.

Basta entrar, apertar o cinto, ligar o veículo, engatá-lo e dirigir. Isso porque carros, caminhões e vans são polimórficos .

Polimorfismo: Dividindo-o

Vejamos a palavra polimorfismo. Você pode dividi-lo em poli , metamorfose e ismo .

Poly significa muitos, como polígono significa muitos ângulos. Quando usado como substantivo, um morfema é uma variante de uma espécie. E ismo pode significar sistema.

Portanto, polimorfismo significa simplesmente um sistema de muitas variações. Isso ainda não diz muito sobre como ele é usado na programação. Essa é a próxima.

Se ele anda como um pato … Por que os objetos polimórficos são incríveis

Quando você cria uma classe em seu código que herda de outra classe, você está vinculando a nova classe a um contrato. O contrato estabelece que todas as variáveis ​​e funções do pai também estarão no filho.

Cada veículo tem um volante, pedais de aceleração e freio e uma seta. Você não precisa abrir o capô para dirigir um carro. Tudo o que importa é que seja um carro.

A mesma coisa se aplica a classes que herdam de outras classes. Aqui está um exemplo em TypeScript:

 
class Vehicle {
private _engine: string;
private _tires: number;
constructor(engine: string = "combustion", tires: number = 4) {
this._engine = engine;
this._tires = tires;
}
accelerate(velocity: number) {
console.log("accelerating at a velocity of " + velocity);
}
brake(pressure: number) {
console.log("applying " + pressure + " pressure");
}
turnLeft() {
console.log("turning left");
}
turnRight() {
console.log("turning right");
}
}
class Car extends Vehicle {
}
class Tesla extends Car {
constructor() {
super("electric");
}
}

Neste exemplo, existe uma classe Vehicle . A classe Car é herdada da classe Vehicle . E Tesla herda de Car . Agora vamos criar alguns objetos e examiná-los.

 let myCoupe: Car = new Vehicle();
console.log(myCoupe);
console.log(myCoupe.constructor.name);
let mySedan: Vehicle = new Tesla();
console.log(mySedan);
console.log(mySedan.constructor.name);
myCoupe.turnLeft();
mySedan.turnLeft();

Você pode ver que declaramos myCoupe um carro e mySedan um veículo . Em seguida, instanciamos myCoupe como um novo veículo e mySedan como um novo Tesla . Se você visitar a sandbox do TypeScript e executar o código, verá que ele funciona sem erros . E se comporta como você esperaria, com base no contrato.

Em outras palavras, todos os veículos podem virar à esquerda porque herdaram da classe Vehicle . O compilador sabe que todos os filhos do Veículo concordaram com o contrato. Portanto, ele assume que está tudo bem, não importa em quais classes os objetos foram digitados ou instanciados.

Isso às vezes é chamado de "digitação de pato". O compilador assume que, se ele anda como um pato e fala como um pato, pode muito bem ser um pato. Assim, o compilador não se preocupa com os detalhes e apenas trata o objeto como um pato.

O polimorfismo torna seu código à prova de balas

Outra vantagem do contrato de polimorfismo é a garantia de que seu código funcionará. Se você digitou fortemente todas as suas variáveis ​​e o que cada função retorna, você sabe que cada filho sempre corresponderá a variáveis, funções e tipos.

Isso significa que você pode adicionar e alterar o código em suas classes sem quebrar seu programa. Cada objeto que faz referência a um objeto Veículo sempre obterá dados e funcionalidades que atendam às expectativas, não importa o quanto o Carro mude.

O código dentro da função pode não apresentar os resultados corretos. Mas esse é um tipo diferente de problema. Contanto que a função siga o contrato e retorne o tipo de variável esperado, não resultará em um erro de quebra de código.

O polimorfismo é enorme, e aqui estão mais 10 princípios de programação que você deve conhecer .

Praticar polimorfismo

  • Use o link da sandbox acima para criar uma classe Barco .
  • Instancie um novo objeto de barco de forma que seja um tipo de Veículo , mas ainda pareça um barco.
  • Certifique-se de que o barco ainda se comporte como um veículo.

Um exemplo final de polimorfismo

O polimorfismo pode ser um conceito difícil de entender inicialmente. Mas, depois de obtê-lo, você deu um grande passo para entender o que realmente significa a programação orientada a objetos. O conceito ainda pode parecer teórico, no entanto. Portanto, aqui está um exemplo sólido do mundo real para ajudá-lo a ver como ele é útil.

Imagine que você está construindo um aplicativo da web que se conecta a um banco de dados MySQL. Em seguida, o chefe decide mudar para um banco de dados PostgreSQL. Isso significa que você deve reescrever todas as chamadas do banco de dados?

Não, não importa. Se seu aplicativo usa uma classe DataAccess com subclasses que realmente mexem com os dados, você está com sorte. A classe DataAccess define como seu aplicativo interage com os dados, não como ele interage com o banco de dados.

Você tem subclasses como MySQLAccess e PostgresQLAccess que fazem todo o trabalho sujo. Mas se seu aplicativo tiver apenas objetos DataAccess , você pode trocar bancos de dados sem reescrever uma única linha do código do aplicativo.