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, 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.

challenge icon

Aufgabe

Einfach

Lassen 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 namens TaskCategory, das verschiedene Arten von Aufgaben in einem Projekt darstellt. Jede Kategorie sollte Folgendes haben:
    • Ein String label Feld für einen menschenlesbaren Namen
    • Ein int priority Feld (1 ist die höchste Priorität, 3 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
    Ihr Enum sollte außerdem Comparable<TaskCategory> implementieren, damit Aufgaben nach Priorität sortiert werden können (niedrigere Prioritätsnummer = kommt zuerst).
  • 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 denen isUrgent wahr ist

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 Fix

Spickzettel

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 const sein
  • Alle Felder müssen final sein
  • 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
}
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