Menu
Coddy logo textTech

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.

challenge icon

Aufgabe

Einfach

Erstellen 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 namens TaskCategory, 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) und testing (label: "Testing", priority: 2)
    • Einen Getter isUrgent, der true zurückgibt, wenn die Priorität 1 ist
    • Eine Methode describe(), die einen String im Format [label] (Priority: [priority]) zurückgibt
    Dein Enum sollte außerdem Comparable<TaskCategory> implementieren, damit Aufgaben nach Priorität sortiert werden können (eine niedrigere Prioritätszahl kommt zuerst).
  • 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 denen isUrgent den Wert true hat

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 Fix

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
}
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