Menu
Coddy logo textTech

Das Schlüsselwort final für Klassen

Teil des Abschnitts Objektorientierte Programmierung der Dart-Journey von Coddy. Lektion 40 von 110.

Manchmal möchte man verhindern, dass eine Klasse erweitert wird. Das Schlüsselwort final verhindert, wenn es auf eine Klasse angewendet wird, dass andere Klassen von ihr erben.

final class DatabaseConnection {
  String connectionString;
  
  DatabaseConnection(this.connectionString);
  
  void connect() {
    print('Connected to $connectionString');
  }
}

// Dies würde einen Kompilierzeitfehler verursachen:
// class CustomConnection extends DatabaseConnection { }

Eine Klasse als final zu kennzeichnen ist nützlich, wenn deren Erweiterung ihr beabsichtigtes Verhalten oder ihre Sicherheitsgarantien beeinträchtigen könnte. Zum Beispiel muss eine Klasse, die sensible Ressourcen verwaltet, möglicherweise sicherstellen, dass ihre Methoden nicht auf unerwartete Weise überschrieben werden.

Dart 3 hat auch verwandte Modifikatoren eingeführt: base zwingt Unterklassen dazu, extends (nicht implements) zu verwenden, und sealed beschränkt die Vererbung auf dieselbe Bibliothek. Konzentrieren Sie sich vorerst auf final als einfachste Methode, um eine Klasse vollständig abzusperren.

Verwenden Sie final-Klassen, wenn Sie sicher sind, dass das Klassendesign abgeschlossen ist und Vererbung nur Probleme verursachen würde. Verwenden Sie es jedoch nicht zu oft – die meisten Klassen profitieren davon, für Erweiterungen offen zu bleiben.

challenge icon

Aufgabe

Einfach

Lass uns ein sicheres Konfigurationssystem erstellen, das veranschaulicht, wann und warum du verhindern möchtest, dass eine Klasse erweitert wird. Du erstellst eine finale Klasse, die Anwendungseinstellungen verwaltet und sicherstellt, dass ihr Verhalten nicht durch Vererbung verändert werden kann.

Du organisierst deinen Code in zwei Dateien:

  • config.dart: Definiere hier deine Konfigurationsklassen:
    • Eine final class AppConfig, die nicht erweitert werden kann. Sie sollte eine Eigenschaft String appName und eine Eigenschaft String version, einen Konstruktor, der beide Werte entgegennimmt, sowie eine Methode display() besitzen, die [appName] v[version] ausgibt.
    • Eine reguläre (nicht finale) Klasse Feature mit einer Eigenschaft String name und einer Eigenschaft bool enabled, einem Konstruktor für beide Werte und einer Methode status(), die [name]: [enabled ? 'ON' : 'OFF'] ausgibt.
    • Eine Klasse ExperimentalFeature, die Feature erweitert und eine Eigenschaft String warning hinzufügt. Überschreibe status() mit @override, rufe zuerst die Version der übergeordneten Klasse mit super.status() auf und gib anschließend Warning: [warning] aus.
  • main.dart: Importiere deine Konfigurationsdatei und veranschauliche den Unterschied zwischen finalen und regulären Klassen:
    • Erstelle eine AppConfig mit dem appName 'MyApp' und der version '2.0.1', und rufe anschließend display() auf.
    • Gib eine leere Zeile aus.
    • Erstelle eine Feature mit dem Namen 'Dark Mode' und dem Wert true für enabled, und rufe anschließend status() auf.
    • Gib eine leere Zeile aus.
    • Erstelle eine ExperimentalFeature mit dem Namen 'AI Assistant', dem Wert false für enabled und der Warnung 'May be unstable', und rufe anschließend status() auf.

Beachte, dass AppConfig als final gekennzeichnet ist, weil ihr Konfigurationsverhalten konsistent und sicher bleiben sollte – keine Unterklasse sollte verändern können, wie Einstellungen verwaltet werden. Feature bleibt dagegen für Erweiterungen offen, sodass ExperimentalFeature spezielles Verhalten hinzufügen kann.

Erwartete Ausgabe:

MyApp v2.0.1

Dark Mode: ON

AI Assistant: OFF
Warning: May be unstable

Probier es selbst

import 'config.dart';

void main() {
  // TODO: Erstelle eine AppConfig mit appName 'MyApp' und version '2.0.1'
  // Rufe dann display() auf
  
  // TODO: Gib eine Leerzeile aus
  
  // TODO: Erstelle ein Feature mit name 'Dark Mode' und enabled true
  // Rufe dann status() auf
  
  // TODO: Gib eine Leerzeile aus
  
  // TODO: Erstelle ein ExperimentalFeature mit name 'AI Assistant',
  // enabled false und warning 'May be unstable'
  // Rufe dann status() auf
}
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung

Übe selbstständig: Online-Dart-Compiler