Enums mit Methoden
Teil des Abschnitts Objektorientierte Programmierung der Dart-Journey von Coddy — Lektion 88 von 110.
In Dart sind Enums nicht nur einfache Listen von Konstanten – sie können Felder, Konstruktoren und Methoden haben, was sie zu leistungsstarken Mini-Klassen macht. Dies wird als Enhanced Enums bezeichnet und ermöglicht es Ihnen, Verhalten und Daten direkt mit jedem Enum-Wert zu verknüpfen.
enum Status {
pending('Waiting'),
approved('Accepted'),
rejected('Denied');
final String displayName;
const Status(this.displayName);
bool get isFinalized => this == approved || this == rejected;
}
void main() {
var status = Status.pending;
print(status.displayName); // Waiting
print(status.isFinalized); // false
print(Status.approved.isFinalized); // true
}Jeder Enum-Wert ruft den Konstruktor mit seinen spezifischen Argumenten auf. Der Konstruktor muss const sein, und alle Felder müssen final sein. Sie können Getter und Methoden hinzufügen, die mit den Daten des Enums arbeiten oder mit anderen Werten vergleichen.
Erweiterte Enums können auch Interfaces implementieren, was ihnen noch mehr Flexibilität verleiht:
enum Priority implements Comparable<Priority> {
low(1),
medium(2),
high(3);
final int level;
const Priority(this.level);
@override
int compareTo(Priority other) => level.compareTo(other.level);
}
void main() {
var tasks = [Priority.high, Priority.low, Priority.medium];
tasks.sort();
print(tasks); // [Priority.low, Priority.medium, Priority.high]
}Erweiterte Enums sind ideal, wenn Sie eine feste Menge an Werten haben, die jeweils zugehörige Daten oder Verhaltensweisen benötigen – wie Statuscodes mit Meldungen, Prioritäten mit Stufen oder Richtungen mit Koordinaten.
Aufgabe
EinfachLassen Sie uns ein Aufgabenverwaltungssystem mit erweiterten Enums bauen! Sie werden ein Enum erstellen, das verschiedene Aufgabenkategorien darstellt, jede mit ihren eigenen Eigenschaften und Verhaltensweisen, die helfen, die Arbeit zu organisieren und zu priorisieren.
Sie werden Ihren Code in zwei Dateien organisieren:
task_category.dart: Erstellen Sie ein erweitertes Enum namensTaskCategory, das verschiedene Arten von Aufgaben in einem Projekt darstellt. Jede Kategorie sollte Folgendes haben:- Ein
String labelFeld für einen menschenlesbaren Namen - Ein
int priorityFeld (1 ist die höchste Priorität, 3 die niedrigste) - Einen
constKonstruktor, der beide Felder initialisiert - Vier Enum-Werte:
bug(label: "Bug Fix", priority: 1),feature(label: "New Feature", priority: 2),documentation(label: "Documentation", priority: 3) undtesting(label: "Testing", priority: 2) - Einen Getter
isUrgent, dertruezurückgibt, wenn die Priorität 1 ist - Eine Methode
describe(), die einen String im Format[label] (Priority: [priority])zurückgibt
Comparable<TaskCategory>implementieren, damit Aufgaben nach Priorität sortiert werden können (niedrigere Prioritätsnummer = kommt zuerst).- Ein
main.dart: Importieren Sie Ihr Aufgabenkategorie-Enum und demonstrieren Sie dessen Funktionen:- Erstellen Sie eine Liste, die alle vier Aufgabenkategorien in dieser Reihenfolge enthält:
feature,bug,documentation,testing - Geben Sie die Beschreibung jeder Kategorie mit der Methode
describe()aus, eine pro Zeile - Geben Sie eine Leerzeile aus
- Sortieren Sie die Liste nach Priorität und geben Sie
After sorting by priority:aus - Geben Sie das Label jeder sortierten Kategorie aus, eines pro Zeile
- Geben Sie eine Leerzeile aus
- Geben Sie
Urgent tasks:aus - Iterieren Sie durch die ursprüngliche Reihenfolge (
feature,bug,documentation,testing) und geben Sie nur die Labels der Kategorien aus, bei denenisUrgentwahr ist
- Erstellen Sie eine Liste, die alle vier Aufgabenkategorien in dieser Reihenfolge enthält:
Diese Herausforderung kombiniert Funktionen von erweiterten Enums: Felder, Konstruktoren, Getter, Methoden und das Implementieren von Schnittstellen – alles zusammenwirkend, um ein nützliches System zur Aufgabenkategorisierung zu erstellen!
Erwartete Ausgabe:
New Feature (Priority: 2)
Bug Fix (Priority: 1)
Documentation (Priority: 3)
Testing (Priority: 2)
After sorting by priority:
Bug Fix
New Feature
Testing
Documentation
Urgent tasks:
Bug FixSpickzettel
Erweiterte Enums in Dart können Felder, Konstruktoren und Methoden haben, was sie zu leistungsstarken Mini-Klassen macht, die jedem Enum-Wert Verhalten und Daten zuweisen.
Einfaches erweitertes Enum mit Feldern und Konstruktor:
enum Status {
pending('Waiting'),
approved('Accepted'),
rejected('Denied');
final String displayName;
const Status(this.displayName);
}Wichtige Anforderungen:
- Der Konstruktor muss
constsein - Alle Felder müssen
finalsein - Jeder Enum-Wert ruft den Konstruktor mit spezifischen Argumenten auf
Erweiterte Enums können Getter und Methoden enthalten:
enum Status {
pending('Waiting'),
approved('Accepted'),
rejected('Denied');
final String displayName;
const Status(this.displayName);
bool get isFinalized => this == approved || this == rejected;
}Erweiterte Enums können Interfaces wie Comparable implementieren:
enum Priority implements Comparable<Priority> {
low(1),
medium(2),
high(3);
final int level;
const Priority(this.level);
@override
int compareTo(Priority other) => level.compareTo(other.level);
}Verwenden Sie erweiterte Enums, wenn Sie einen festen Satz von Werten haben, die jeweils zugehörige Daten oder Verhaltensweisen benötigen.
Probier es selbst
import 'task_category.dart';
void main() {
// TODO: Erstelle eine Liste, die alle vier Aufgabenkategorien in dieser Reihenfolge enthält:
// feature, bug, documentation, testing
// TODO: Gib die Beschreibung jeder Kategorie mit describe() aus, eine pro Zeile
// TODO: Gib eine Leerzeile aus
// TODO: Sortiere die Liste nach priority
// TODO: Gib "After sorting by priority:" aus
// TODO: Gib das Label jeder sortierten Kategorie aus, eines pro Zeile
// TODO: Gib eine Leerzeile aus
// TODO: Gib "Urgent tasks:" aus
// TODO: Durchlaufe die ursprüngliche Reihenfolge (feature, bug, documentation, testing)
// und gib nur die Labels der Kategorien aus, bei denen isUrgent true ist
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der OOP
Externe DateienBibliotheken & ImportsEinführung in die OOPKlassen vs. ObjekteDas this-SchlüsselwortMethodenInstanzvariablenKonstruktor-GrundlagenWiederholung – Einfacher Taschenrechner4Null-Sicherheit
Einführung in Null-SicherheitNullable vs. Non-NullableDie ? und ! OperatorenLate-Schlüsselwort & Null-SicherheitNull-aware OperatorenNull-Sicherheit in KlassenZusammenfassung – Benutzerprofil-System7Abstrakte Klassen & Interfaces
Abstrakte KlassenAbstrakte MethodenInterfaces in DartImplizite InterfacesImplementieren vs. ErweiternMehrfache InterfacesRückblick – Shape Calculator10Collections & Generics
Überblick über List, Set und MapTypsichere CollectionsGenerische KlassenGenerische MethodenGenerische ConstraintsIterable & IteratorZusammenfassung – Generische Speicherung13Fortgeschrittene OOP-Konzepte
Komposition vs. VererbungExtension MethodsCallable ClassesSealed Classes (Dart 3)Records (Dart 3)Patterns & Matching (3.0)Enums mit Methoden16Projekt: Bibliotheksverwaltung
ProjektübersichtBuch- und Benutzerklassen2Konstruktoren in Dart
Standard-KonstruktorBenannte KonstruktorenInitialisierungslistenKonstante KonstruktorenFactory-KonstruktorenWeiterleitende KonstruktorenZusammenfassung – Shape Builder5Kapselung
Öffentliche vs. private MemberDie _ Präfix-KonventionSichtbarkeit auf Library-EbeneGetter & Setter im DetailInformation HidingRückblick – Schülerdatensätze8Mixins
Einführung in MixinsMixins erstellenMehrere Mixins verwendenDas on-Schlüsselwort in MixinsMixin vs. VererbungMixin vs. InterfaceZusammenfassung - Tiersystem11Spezielle Methoden
toString() überschreibenhashCode & == überschreibenComparable-Interfacecall()-MethodenoSuchMethod überschreibenZusammenfassung – Eigene Collection14Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFactory-MusterObserver-MusterStrategy-Muster3Klasseneigenschaften
Instanz- vs. statische MemberFinal & Const FelderLate-VariablenStatische Methoden & FelderGetter und SetterZusammenfassung – Bankkonto-Manager6Vererbung
Grundlagen der VererbungDas super-SchlüsselwortMethoden überschreibenDie @override-AnnotationDas final-Klassen-SchlüsselwortKonstruktoren & VererbungRückblick – Mitarbeiter-Hierarchie9Polymorphismus
Polymorphismus-GrundlagenPolymorphismus über InterfacesTypprüfung zur LaufzeitDie is & as OperatorenDas covariant SchlüsselwortZusammenfassung – Payment Processor