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, wodurch sie zu leistungsfähigen Mini-Klassen werden. Dies wird als erweiterte Enums bezeichnet und ermöglicht es dir, jedem Enum-Wert direkt Verhalten und Daten zuzuordnen.
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. Du kannst Getter und Methoden hinzufügen, die mit den Daten des Enums arbeiten oder es 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
EinfachErstellen wir ein Aufgabenverwaltungssystem mithilfe von erweiterten Enums! Du erstellst ein Enum, das verschiedene Aufgabenkategorien repräsentiert, wobei jede Kategorie eigene Eigenschaften und Verhaltensweisen besitzt, die dabei helfen, Arbeit zu organisieren und zu priorisieren.
Du organisierst deinen Code in zwei Dateien:
task_category.dart: Erstelle ein erweitertes Enum namensTaskCategory, das verschiedene Aufgabentypen in einem Projekt repräsentiert. Jede Kategorie sollte Folgendes enthalten:- Ein
String label-Feld für einen menschenlesbaren Namen - Ein
int priority-Feld (1 steht für die höchste Priorität, 3 für die niedrigste) - Einen
const-Konstruktor, 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 (eine niedrigere Prioritätszahl kommt zuerst).- Ein
main.dart: Importiere dein Aufgaben-Kategorie-Enum und demonstriere seine Funktionen:- Erstelle eine Liste, die alle vier Aufgabenkategorien in dieser Reihenfolge enthält:
feature,bug,documentation,testing - Gib die Beschreibung jeder Kategorie mithilfe der Methode
describe()aus, jeweils eine pro Zeile - Gib eine leere Zeile aus
- Sortiere die Liste nach Priorität und gib
After sorting by priority:aus - Gib das Label jeder sortierten Kategorie aus, jeweils eines pro Zeile
- Gib eine leere Zeile aus
- Gib
Urgent tasks:aus - Durchlaufe die ursprüngliche Reihenfolge (
feature,bug,documentation,testing) und gib nur die Labels der Kategorien aus, bei denenisUrgentden Wert true hat
- Erstelle eine Liste, die alle vier Aufgabenkategorien in dieser Reihenfolge enthält:
Diese Herausforderung verbindet die Funktionen erweiterter Enums: Felder, Konstruktoren, Getter, Methoden und das Implementieren von Schnittstellen – alles wirkt zusammen, 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 FixProbier 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 Schlüsselwort thisMethodenInstanzvariablenGrundlagen von KonstruktorenRückblick – Einfacher Taschenrechner4Null-Sicherheit
Einführung in die Null-SicherheitNullable vs. Non-NullableDie Operatoren ? und !Late-Schlüsselwort und Null-SicherheitNull-bewusste OperatorenNull-Sicherheit in KlassenRückblick – Benutzers профilsystem7Abstrakte Klassen & Interfaces
Abstrakte KlassenAbstrakte MethodenInterfaces in DartImplizite InterfacesImplementieren vs. ErweiternMehrere InterfacesZusammenfassung – Formrechner10Collections & Generics
Übersicht über List, Set und MapTypsichere CollectionsGenerische KlassenGenerische MethodenGenerische EinschränkungenIterable & IteratorRückblick – Generischer Speicher13Fortgeschrittene OOP-Konzepte
Komposition vs. VererbungErweiterungsmethodenAufrufbare KlassenVersiegelte Klassen (Dart 3)Records (Dart 3)Muster & Matching (3.0)Enums mit Methoden16Projekt: Bibliotheksverwaltung
ProjektübersichtBuch- und Benutzerklassen2Konstruktoren in Dart
StandardkonstruktorBenannte KonstruktorenInitialisierungslistenKonstantenkonstruktorenFactory-KonstruktorenWeiterleitende KonstruktorenRückblick – Shape Builder5Kapselung
Öffentliche vs. private MemberDie _-Präfix-KonventionBibliotheksweite SichtbarkeitTiefergehende Getter & SetterInformationsverbergungRückblick – Studierendendaten8Mixins
Einführung in MixinsMixins erstellenMehrere Mixins verwendenDas Schlüsselwort „on“ in MixinsMixin vs. VererbungMixin vs. SchnittstelleRückblick – Tiersystem11Spezielle Methoden
toString()-ÜberschreibunghashCode- & ==-ÜberschreibungComparable-Schnittstellecall()-MethodenoSuchMethod-ÜberschreibungWiederholung – Benutzerdefinierte Collection14Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFabrikmusterBeobachtermusterStrategiemuster17Abschließende Herausforderungen
E-Learning-PlattformBankingsystemSpielcharaktersystemFahrzeugvermietung3Klassen-Eigenschaften
Instanz- vs. statische MemberFinal- und Const-FelderLate-VariablenStatische Methoden und FelderGetter und SetterRückblick – Bankkontoverwaltung6Vererbung
Grundlegende VererbungDas Schlüsselwort superMethodenüberschreibungDie Annotation @overrideDas Schlüsselwort final für KlassenKonstruktoren und VererbungZusammenfassung – Mitarbeiterhierarchie9Polymorphismus
Grundlagen des PolymorphismusPolymorphismus über InterfacesLaufzeit-TypüberprüfungDie Operatoren is & asCovariant-SchlüsselwortZusammenfassung – ZahlungsprozessorÜbe selbstständig: Online-Dart-Compiler