Class Modifiers Modificadores de Classe

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

  1. sealed + abstract: sealed já contém abstract implicitamente, combinação proibida
  2. interface/final/sealed + mixin: não podem ser combinados
  3. Não é possível declarar base /interface/final /sealed simultaneamente no mesmo nível

Class Modifiers Modificadores de Classe

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *