Skip to content

Kapitel 9: Spezielle Klassen und Eigenschaften

9.1 Aufzählungen (Enum)

Enum-Definition und Verwendung

dart
enum Farbe {
  rot,
  grün,
  blau
}

void main() {
  Farbe farbe = Farbe.rot;
  
  if (farbe == Farbe.rot) {
    print('Farbe ist rot');
  }
  
  // Alle Enum-Werte durchlaufen
  for (Farbe f in Farbe.values) {
    print(f);
  }
}

Enum-Anwendungsszenarien

  • Statusbeurteilung
  • Feste Optionen

9.2 Generics

Definition von Generics

dart
// Generische Klasse
class Behälter<T> {
  T inhalt;
  
  Behälter(this.inhalt);
  
  T getInhalt() {
    return inhalt;
  }
}

void main() {
  Behälter<String> stringBehälter = Behälter('Hallo');
  print(stringBehälter.getInhalt());
  
  Behälter<int> intBehälter = Behälter(123);
  print(intBehälter.getInhalt());
}

Generische Methoden

dart
T getFirst<T>(List<T> list) {
  return list[0];
}

void main() {
  print(getFirst([1, 2, 3]));  // 1
  print(getFirst(['a', 'b', 'c']));  // a
}

Generische Einschränkungen

dart
// T muss von Comparable erben
T getMax<T extends Comparable>(T a, T b) {
  return a.compareTo(b) > 0 ? a : b;
}

9.3 Mixin

Mixin-Definition

dart
mixin Flugfähig {
  void fliegen() {
    print('Kann fliegen');
  }
}

mixin Schwimmfähig {
  void schwimmen() {
    print('Kann schwimmen');
  }
}

class Vogel with Flugfähig {}
class Ente with Flugfähig, Schwimmfähig {}

void main() {
  Vogel vogel = Vogel();
  vogel.fliegen();
  
  Ente ente = Ente();
  ente.fliegen();
  ente.schwimmen();
}

Mixin-Anwendungsszenarien

  • Code-Wiederverwendung
  • Vermeidung von Mehrfachvererbungskonflikten

9.4 Praxisbeispiel

dart
enum Status {
  ausstehend,
  inBearbeitung,
  abgeschlossen
}

mixin Protokollierung {
  void protokollieren(String nachricht) {
    print('[' + DateTime.now().toString() + '] ' + nachricht);
  }
}

class Aufgabe with Protokollierung {
  String titel;
  Status status;
  
  Aufgabe(this.titel) : status = Status.ausstehend;
  
  void starten() {
    status = Status.inBearbeitung;
    protokollieren('Aufgabe gestartet: ' + titel);
  }
  
  void abschließen() {
    status = Status.abgeschlossen;
    protokollieren('Aufgabe abgeschlossen: ' + titel);
  }
}

void main() {
  Aufgabe aufgabe = Aufgabe('Dart lernen');
  aufgabe.starten();
  aufgabe.abschließen();
}

Frei für alle Anfänger