Controla as permissões de herança, implementação e instanciação de classes por bibliotecas externas, restringindo os corpos de tipo
Ordem dos modificadores [abstract] [base/interface/final/sealed] [mixin] class; alguns modificadores são mutuamente exclusivos
1. Sem modificador
Qualquer biblioteca pode instanciar, herdar ou implementar
// a.dart
class Vehicle {
void move() {}
}
// b.dart
import 'a.dart';
Vehicle v = Vehicle();
class Car extends Vehicle {}
class Mock implements Vehicle {}
Code language: JavaScript (javascript)
2. abstract classe abstrata
Não pode ser instanciada; códigos externos podem utilizar extends /implements
abstract class Vehicle {
void move(); // método abstrato
}
// Válido
class Car extends Vehicle {
@override void move() {}
}
class Mock implements Vehicle {
@override void move() {}
}
// Vehicle(); // Erro, instanciação impossível
Code language: JavaScript (javascript)
3. base class
√ new permitido|√ extends externo liberado|× implements externo proibido
Garante que as subclasses herdam obrigatoriamente a implementação da classe mãe, impedindo criações de implementações falsas por código externo
// lib/a.dart
base class Vehicle {
void move() => print("move");
}
// main.dart
import 'a.dart';
Vehicle v = Vehicle();
base class Car extends Vehicle {} // √ Herança requer declaração base/final/sealed
// class Mock implements Vehicle {} // × Implementação externa é proibida
Code language: JavaScript (javascript)
4. interface class
√ new permitido|× extends externo proibido|√ implements externo liberado
// a.dart
interface class Vehicle {
void move() => print("move");
}
// main.dart
import 'a.dart';
Vehicle v = Vehicle();
// class Car extends Vehicle {} // × Herança externa não é permitida
class Mock implements Vehicle { // √ Implementação autorizada
@override void move() {}
}
Code language: PHP (php)
abstract interface
Interface pura, amplamente utilizada
Não pode ser instanciada; apenas o implements é permitido para códigos externos
abstract interface class Vehicle {
void move();
}
class Mock implements Vehicle {
@override void move() {}
}
Code language: PHP (php)
5. final class
√ new permitido|× extends externo proibido|× implements externo proibido
Não há possibilidade de derivação externa, mantém a API pública estável
// a.dart
final class Vehicle {}
// main.dart
import 'a.dart';
Vehicle v = Vehicle();
// class Car extends Vehicle {} // ❌
// class Mock implements Vehicle{} // ❌
Code language: JavaScript (javascript)
6. sealed class (classe selada)
× new proibido|× extends/implements externos proibidos;as subclasses devem ser declaradas no mesmo arquivo
O compilador reconhece todas as subclasses diretas e força a correspondência exaustiva nas instruções switch
sealed class Vehicle {}
class Car extends Vehicle {}
class Bike extends Vehicle {}
void test(Vehicle v) {
switch(v) {
case Car(): print("car");
case Bike(): print("bike");
}
}
// Vehicle(); // ❌ sealed é implicitamente abstract, impossível instanciar
Code language: PHP (php)
Regras de exclusão mútua
sealed+abstract: sealed já contém abstract implicitamente, combinação proibidainterface/final/sealed+mixin: não podem ser combinados- Não é possível declarar base /interface/final /sealed simultaneamente no mesmo nível
Class Modifiers Modificadores de Classe