Dart: extends vs implements vs with
uma forma resumida para entender mixins
1⃣️ Usando extends
🤔 Você sabe o que é Herança?
Herança nos permite criar novas classes que reutilizam, estendem e/ou modificam o comportamento de classes preexistentes. A classe preexistente é chamada de superclasse e a nova classe que estamos criando se chama classe derivada. No Dart, podemos herdar apenas uma superclasse, mas herança é transitiva. Se a classe Hatch é derivada da classe Car e essa classe Car é derivada da classe Vehicle, então a classe Hatch será derivada da classe Vehicle. Use extends
para criar uma classe derivada e super
quando quiser se referir à superclasse.
Quando class Car extends Vehicle
, todas as propriedades, variáveis e métodos implementados na classe Vehicle também estarão disponíveis na classe Car.
Também é possível reescrever as funções da superclasse.
Resumo: Você usa
extends
quando quiser criar uma versão mais específica de uma classe.
2⃣️ Usando implements
Suponha que você queira criar a sua própria classe Car, sem herdar todas as propriedades, variáveis e métodos da classe Vehicle, porém quer herdar apenas o tipo Vehicle. Para fazer isso a classe Car deve implementar a interface Vehicle.
O Dart possibilita implementar diversas classes e interfaces.
✍️ Exemplo
Imagine que você tenha que implementar um pássaro e um pato, ambos são animais, porém o pássaro consegue apenas voar e o pato pode voar e nadar. Faremos isso usando o que sabemos até o momento.
Primeiro vamos criar a superclasse e os comportamentos:
Agora criaremos Bird
e Duck
, implementando seus comportamentos:
Observe que usando implements
tivemos que implementar os métodos fly
e swim
, repetindo código! Não foi possível herdar a implementação dos comportamentos dessa maneira. Será que existe uma forma de reutilizar o código desses comportamentos? Sim, veremos a seguir!
3⃣️ Usando with
Mixin é um tipo diferente de estrutura, que só pode ser usado com a palavra-chave with
e é usado para incluir trechos comuns de códigos, ou seja, reutilizar código.
Mixins are a way of reusing a class’s code in multiple class hierarchies (dartlang.org).
Vejamos então como ficará a implementação anterior usando mixins:
Você pode substituir abstract class
por mixin
se preferir.
Mixins são uma forma de abstrair e reutilizar métodos e estados, é similar a reutilização do código de uma classe herdada, porém não há múltiplas heranças, continua existindo apenas uma superclasse. Funcionam colocando a implementação do mixin no topo da superclasse para criar uma nova classe. No exemplo acima, é possível reescrever um método, mixins permitem isso.
✌️Agradecimentos
Essa foi minha primeira história no Medium, espero tenha gostado 😃.
Gostaria de agradecer ao Romain Rastel pelo incrível artigo sobre mixins, aconselho você a ler para entender ainda mais sobre o assunto.
Qualquer dúvida, fique à vontade em perguntar abaixo.