Steuert die Rechte zur Vererbung, Implementierung und Instanziierung von Klassen durch externe Bibliotheken und schränkt Typkörper ein
Reihenfolge der Modifikatoren [abstract] [base/interface/final/sealed] [mixin] class; einige Modifikatoren schließen sich gegenseitig aus
1. Ohne Modifikator
Jede Bibliothek kann Instanzen erstellen, erben oder implementieren
// a.dart
class Vehicle {
void move() {}
}
// b.dart
import 'a.dart';
Vehicle v = Vehicle();
class Car extends Vehicle {}
class Mock implements Vehicle {}
Code-Sprache: JavaScript (javascript)
2. abstract Abstrakte Klasse
Kann nicht instanziiert werden; externer Code darf extends /implements nutzen
abstract class Vehicle {
void move(); // Abstrakte Methode
}
// Gültig
class Car extends Vehicle {
@override void move() {}
}
class Mock implements Vehicle {
@override void move() {}
}
// Vehicle(); // Fehler, Instanziierung nicht möglich
Code-Sprache: JavaScript (javascript)
3. base class
√ new erlaubt|√ extern extends erlaubt|× extern implements verboten
Sichert, dass Unterklassen stets die Implementierung der Oberklasse erben und verhindert gefälschte externe Implementierungen
// lib/a.dart
base class Vehicle {
void move() => print("move");
}
// main.dart
import 'a.dart';
Vehicle v = Vehicle();
base class Car extends Vehicle {} // √ Bei Vererbung ist base/final/sealed erforderlich
// class Mock implements Vehicle {} // × Externe Implementierung verboten
Code-Sprache: JavaScript (javascript)
4. interface class
√ new erlaubt|× extern extends verboten|√ extern implements erlaubt
// a.dart
interface class Vehicle {
void move() => print("move");
}
// main.dart
import 'a.dart';
Vehicle v = Vehicle();
// class Car extends Vehicle {} // × Externe Vererbung verboten
class Mock implements Vehicle { // √ Implementierung erlaubt
@override void move() {}
}
Code-Sprache: PHP (php)
abstract interface
Reines Interface, sehr gebräuchlich
Nicht instanziierbar; von außen nur implements zulässig
abstract interface class Vehicle {
void move();
}
class Mock implements Vehicle {
@override void move() {}
}
Code-Sprache: PHP (php)
5. final class
√ new erlaubt|× extern extends verboten|× extern implements verboten
Keine externe Ableitung möglich, sorgt für eine stabile öffentliche API
// a.dart
final class Vehicle {}
// main.dart
import 'a.dart';
Vehicle v = Vehicle();
// class Car extends Vehicle {} // ❌
// class Mock implements Vehicle{} // ❌
Code-Sprache: JavaScript (javascript)
6. sealed class (versiegelte Klasse)
× new verboten|× extern extends/implements verboten;Unterklassen müssen in derselben Datei stehen
Der Compiler erkennt alle direkten Unterklassen und erzwingt eine vollständige Abdeckung bei switch-Anweisungen
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 ist implizit abstract, keine Instanziierung
Code-Sprache: PHP (php)
Gegenseitiger Ausschluss
sealed+abstract: sealed bringt abstract implizit mit, Kombination unzulässiginterface/final/sealed+mixin: Kombination nicht möglich- Auf derselben Ebene können nicht gleichzeitig base /interface/final /sealed angegeben werden
Class Modifiers Klassenmodifikatoren