Novos Modificadores de Classe no Dart 3
Tags: modificadores, acesso, dart3, dart
Published: 2024-05-18 13:38:52


![dart 3](https://cdn-images-1.medium.com/max/800/1*pF-kGlWaQSl0zXoChkAtXg.png)

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.

![](https://cdn-images-1.medium.com/max/800/1*k4w1ng1YNZ6gUr4qNbllow.png)

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íd**a, mas não **estendida** (fora da biblioteca).

![](https://cdn-images-1.medium.com/max/800/1*0tD7yQ2KmU7Ka4Vf6iJauA.png)

![](https://cdn-images-1.medium.com/max/800/1*aji02l_3MFBnIvxcyKAsMw.png)

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.**

![](https://cdn-images-1.medium.com/max/800/1*aHoQNJzU5Vr4CpwXzI7Zxw.png)

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).

![](https://cdn-images-1.medium.com/max/800/1*_pTRstZqiKMhH_27G1WhKA.png)

Se estiver em arquivos separados a regra se mantém e não é possível estender.

![](https://cdn-images-1.medium.com/max/800/1*y-YSy6DinHPu6RQzDSVEfA.png)

### 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.**

![](https://cdn-images-1.medium.com/max/800/1*LR-OP5-PftQLw6EoxzjkdQ.png)

Se criarmos outra classe e **estender** de **Cachorro** não será possível e irá apresentar um erro.

![](https://cdn-images-1.medium.com/max/800/1*mk2tC05uwb1u_U9QW84f9g.png)

### 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**.

![](https://cdn-images-1.medium.com/max/800/1*gbrzq1op3C40-FnXt4_3ew.png)

Se tentarmos estender da classe **Animal** irá ocorrer um erro:

![](https://cdn-images-1.medium.com/max/800/1*Umf9uDH8z1EbjVBjE9fjQg.png)

Para resolver o problema a classe **Cachorro** deverá ser **final** ou **sealed**.

![](https://cdn-images-1.medium.com/max/800/1*j1JoKnz9oYH_quVUEn0dGg.png)

Se tentar **implementar** a classe **Animal** também não será possível.

![](https://cdn-images-1.medium.com/max/800/1*Zs5RbSYpoeawCHrqnCyumw.png)

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.

![](https://cdn-images-1.medium.com/max/800/1*uVtmXnyjk4C4OoqjF_UYng.png)

### 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.

![](https://cdn-images-1.medium.com/max/800/1*ftczZrCQg-s2PjsJg959EA.png)

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**.

![](https://cdn-images-1.medium.com/max/800/1*B_hgOZx4LT7fE_WiD8NJcQ.png)

![](https://cdn-images-1.medium.com/max/800/1*fic99By-uyXDJnaXraPSeQ.png)

Muito bacana esses novos modificadores né? Para mais informações procure na documentação oficial do dart [https://dart.dev/language/class-modifiers](https://dart.dev/language/class-modifiers) ou em [https://dart.dev/language/modifier-reference#valid-combinations](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:
<a href="https://www.youtube.com/watch?v=E6jfQwaLtik" target="_blank">
 <img src="https://img.youtube.com/vi/E6jfQwaLtik/0.jpg" alt="Monorepo (Por Que Essa Estratégia Funciona em Grandes Empresas?) " width="240" height="180" border="10" />
</a>


Vlw! 😉


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/obcg0d2y00yddve9quky.png)


Entre em nosso discord para interagir com a comunidade: flutterbrasil.com.br