Class Modifiers Klassenmodifikatoren

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

  1. sealed + abstract: sealed bringt abstract implizit mit, Kombination unzulässig
  2. interface/final/sealed + mixin: Kombination nicht möglich
  3. Auf derselben Ebene können nicht gleichzeitig base /interface/final /sealed angegeben werden

Class Modifiers Klassenmodifikatoren

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert