Skip to content

Latest commit

 

History

History
161 lines (114 loc) · 5.87 KB

File metadata and controls

161 lines (114 loc) · 5.87 KB

Logo Dark

Logo Light


Resumo

Polimorfismo

Recapitulando... "O Polimorfismo diz respeito à especialização das classes “filhas” (herdeiras)."

Conceito

A palavra polimorfismo significa "de muitas formas" (do grego "poli" = muitas, "morphos" = forma). É exatamente com isso que o quarto e último pilar está preocupado – que tipos nas mesmas cadeias de herança sejam capazes de fazer coisas diferentes.

Na natureza, vemos animais que são capazes de alterar sua forma conforme a necessidade, e é dessa ideia que vem o polimorfismo na orientação a objetos. Como sabemos, os objetos filhos herdam as características e ações de seus “ancestrais”. Entretanto, em alguns casos, é necessário que as ações para um mesmo método seja diferente. Em outras palavras, o polimorfismo consiste na alteração do funcionamento interno de um método herdado de um objeto pai.


Vamos dizer que um dos motivos de você ter comprado um carro, por exemplo, foi a qualidade do sistema de som dele. Mas, no seu caso, digamos que a reprodução só pode ser feita via rádio ou Bluetooth, enquanto que no seu antigo carro, podia ser feita apenas via cartão SD e pendrive.

Em ambos os carros está presente o método "tocar música", mas, como o sistema de som deles é diferente, a forma como o carro toca as músicas é diferente. Dizemos que o método "tocar música" é uma forma de polimorfismo, pois dois objetos, de duas classes diferentes, têm um mesmo método que é implementado de formas diferentes, ou seja, um método possui várias formas, várias implementações diferentes em classes diferentes, mas que possuem o mesmo efeito.

Sobrescrita de método

Para aplicar de fato o polimorfismo então, é possível sobrescrever um método que existe na classe de origem (a superclasse, ou classe mãe/pai). Para isso, basta escrever um método com o mesmo nome. Dessa maneira, ao ser executado, o programa levará em consideração o método criado na classe herdeira.

Vamos olhar para esse exemplo:

class Person {
  name;
  age;

  constructor(name, age) {
    this.name = name;
    this.age = age;
  }

  speak() {
    console.log(`A pessoa de nome ${this.name} está falando.`);
  }
}

class User extends Person {
  email;
  password;

  constructor(name, age, email, password) {
    super(name, age);
    this.email = email;
    this.password = password;
  }

  speak() {
    console.log(`A usuária de nome ${this.name} está falando.`);
  }
}

class Student extends Person {
  email;

  constructor(name, age, email) {
    super(name, age);
    this.email = email;
  }

  speak() {
    console.log(`A estudante de nome ${this.name} está falando.`);
  }
}

const person1 = new User('Bianca', 20);
person1.speak(); // A pessoa de nome Bianca está falando.

const user1 = new User('Luara', 27, 'luarakerlen@hotmail.com', 123456);
user1.speak(); // A usuária de nome Luara está falando.

const student1 = new User('Maria', 36, 'maria@hotmail.com');
student1.speak(); // A estudante de nome Maria está falando.

Nesse caso, sobrescrevemos o método speak() tanto dentro da classe User, quanto da classe Student, cada uma à sua maneira. As duas classes são herdeiras de Person.

Quando fazemos herança e trabalhamos com polimorfismo, precisamos sempre analisar quais métodos precisam ou não precisam ser sobrescritos. Às vezes um método precisa ser sobrescrito na classe herdeira X, mas o mesmo método não precisa ser sobrescrito na classe herdeira Y. Com o polimorfismo, temos essa liberdade.


Além disso, também é possível apenas acrescentar algo no método herdado. Para isso, precisamos criar um método de mesmo nome na classe herdeira e utilizar a sintaxe super.nomeDoMetodo() dentro dela:

class Person {
  name;
  age;

  constructor(name, age) {
    this.name = name;
    this.age = age;
  }

  speak() {
    console.log(`A pessoa de nome ${this.name} está falando.`);
  }
}

class User extends Person {
  email;
  password;

  constructor(name, age, email, password) {
    super(name, age);
    this.email = email;
    this.password = password;
  }

  speak() {
    super.speak();
    console.log(`A pessoa que está falando é uma usuária.`);
  }
}

const user1 = new User('Luara', 27, 'luarakerlen@hotmail.com', 123456);
user1.speak(); // A pessoa de nome Luara está falando. A pessoa que está falando é uma usuária.

O que acontece se invertermos a ordem em que o super.speak() é chamado dentro da classe herdeira?

→ Vamos aplicar?

→ Exercício para casa

Exercício para casa

Links Úteis


Voltar para o início

Desenvolvido com 💜 por Luara Kerlen