No novo Dart 3 tivemos uma mudança bastante interessante que são os novos modificadores de classe, confesso que quando migrei para o Dart achei estranho não termos alguns modificadores de classe, como o interface, e usávamos o abstract para suprir esse déficit.
Os modificadores de classe podem ser utilizados em uma classe e antes da palavra reservada class, como já estamos acostumados.
Com o Dart 3 além dos modificadores que já estamos acostumados como abstract e mixin que era possível você construir, entender ou implementar uma classe, agora também temos a interface, final, sealed e base que trazem limitadores na c*onstrução, extensão e implementação* das classes que possuem esses modificadores, vamos entender o que cada uma traz de novo.
Interface
Se você chegou a trabalhar com outra linguagem que tem interfaces como C# ou JAVA vai perceber uma diferença com a interfaces do Dart, pois ao contrario das outras linguagens que a interface serve apenas para definir o contrato de métodos, no Dart a inteface define uma classe que pode ser implementada e construída, mas não estendida (fora da biblioteca).
Mas calma, nem tudo está perdido, se você quiser criar uma classe que defina apenas o contrato do que deve ser implementado(com o no C# ou JAVA) adicione o modificador abstract junto a interface , ficando abtract interface class.
Note que a regra de não poder estender uma interface só vale quando é uma classe externa ao arquivo, se estiver dentro do mesmo arquivo ainda assim conseguirei estender a interface (isso vale para a limitação de todos os outros modificadores que iremos falar).
Se estiver em arquivos separados a regra se mantém e não é possível estender.
Final
Uma classe que contém o modificador final limita que a classe não pode ser implementada ou estendida externamente, mas pode ser construída.
Vamos criar uma classe final Cachorro.
Se criarmos outra classe e estender de Cachorro não será possível e irá apresentar um erro.
Base
Já o modificador Base diferente da interface não permite que a classe seja implementada em uma outra classe que esteja externo ao biblioteca, mas permite que ela seja construída ou estendida.
Além do mais, as subclasses que irão estender a classe base deverão ser uma classe com os modificadores final ou sealed.
Se tentarmos estender da classe Animal irá ocorrer um erro:
Para resolver o problema a classe Cachorro deverá ser final ou sealed.
Se tentar implementar a classe Animal também não será possível.
Vale lembrar que assim como nas interfaces é possível adicionar o modificador abstract base para que não precise implementar os métodos na classe base deixando apenas os contratos.
Sealed
O modificador sealed é um dos mais restritivos dentro do Dart, com ela a classe não poderá ser implementada, estendida e nem construída externamente, o uso dela será restrito para uso interno da biblioteca e possibilitara a checagem exaustiva de suas subclasses no switch.
Agora se fizermos um switch verificando os tipos do Failure o linter já irá retornar um erro dizendo para verificar todas as subclasses de Failure.
Muito bacana esses novos modificadores né? Para mais informações procure na documentação oficial do dart https://dart.dev/language/class-modifiers ou em https://dart.dev/language/modifier-reference#valid-combinations.
Nosso querido Professor Diego também tem um vídeo bem bacana sobre esse assunto, confira abaixo:
Vlw! 😉
Entre em nosso discord para interagir com a comunidade: flutterbrasil.com.br
Top comments (0)