Class Modifiers Modificateurs de classe

Contrôler les droits d’héritage, d’implémentation et d’instanciation des classes depuis les bibliothèques externes et restreindre les corps de type

Ordre des modificateurs [abstract] [base/interface/final/sealed] [mixin] class ; certains modificateurs sont mutuellement exclusifs

1. Sans modificateur

Toute bibliothèque peut instancier, hériter ou implémenter

// a.dart
class Vehicle {
  void move() {}
}

// b.dart
import 'a.dart';
Vehicle v = Vehicle();
class Car extends Vehicle {}
class Mock implements Vehicle {}
Langage du code : JavaScript (javascript)

2. abstract classe abstraite

Impossible à instancier ; le code externe peut utiliser extends /implements

abstract class Vehicle {
  void move(); // méthode abstraite
}

// Valide
class Car extends Vehicle {
  @override void move() {}
}

class Mock implements Vehicle {
  @override void move() {}
}

// Vehicle(); // Erreur, instanciation interdite
Langage du code : JavaScript (javascript)

3. base class

√ Autorisé new|√ extends externe autorisé|× implements externe interdit

Garantit que les sous-classes héritent bien de l’implémentation de la classe parente et empêche les fausses implémentations externes

// lib/a.dart
base class Vehicle {
  void move() => print("move");
}

// main.dart
import 'a.dart';
Vehicle v = Vehicle();

base class Car extends Vehicle {} // √ Héritage nécessite base/final/sealed

// class Mock implements Vehicle {} // × Implémentation externe interdite
Langage du code : JavaScript (javascript)

4. interface class

√ Autorisé new|× extends externe interdit|√ implements externe autorisé

// a.dart
interface class Vehicle {
  void move() => print("move");
}

// main.dart
import 'a.dart';
Vehicle v = Vehicle();

// class Car extends Vehicle {} // × Héritage externe interdit
class Mock implements Vehicle { // √ Implémentation autorisée
  @override void move() {}
}
Langage du code : PHP (php)

abstract interface

Interface pure, très utilisée

Ne peut pas être instanciée ; seul implements est autorisé depuis l’extérieur

abstract interface class Vehicle {
  void move();
}
class Mock implements Vehicle {
  @override void move() {}
}
Langage du code : PHP (php)

5. final class

√ Autorisé new|× extends externe interdit|× implements externe interdit

Aucune dérivation externe possible, garantit une API publique stable

// a.dart
final class Vehicle {}

// main.dart
import 'a.dart';
Vehicle v = Vehicle();
// class Car extends Vehicle {}    // ❌
// class Mock implements Vehicle{} // ❌
Langage du code : JavaScript (javascript)

6. sealed class (classe scellée)

× Interdit new|× extends/implements externes interdits ; les sous-classes doivent figurer dans le même fichier

Le compilateur identifie toutes les sous-classes directes et impose une correspondance exhaustive dans les 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 est implicitement abstract, instanciation impossible
Langage du code : PHP (php)

Exclusions mutuelles

  1. sealed + abstract : sealed comporte déjà abstract, combinaison interdite
  2. interface/final/sealed + mixin : association impossible
  3. Impossible de déclarer simultanément base /interface/final /sealed au même niveau

Class Modifiers Modificateurs de classe

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *