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
sealed+abstract: sealed comporte déjà abstract, combinaison interditeinterface/final/sealed+mixin: association impossible- Impossible de déclarer simultanément base /interface/final /sealed au même niveau
Class Modifiers Modificateurs de classe