Menu
Coddy logo textTech

Erweiterungsmethoden

Teil des Abschnitts Objektorientierte Programmierung der Dart-Journey von Coddy. Lektion 83 von 110.

Manchmal möchtest du einer Klasse, die dir nicht gehört, Funktionalität hinzufügen – etwa Darts integrierten Typen String oder int. Du kannst ihren Quellcode nicht ändern, und Vererbung hilft bei finalen Klassen nicht weiter. Hier kommen Erweiterungsmethoden ins Spiel.

Erweiterungen ermöglichen es dir, neue Methoden zu vorhandenen Typen hinzuzufügen, ohne sie zu ändern oder Unterklassen zu erstellen:

extension StringExtras on String {
  String reverse() {
    return split('').reversed.join('');
  }
  
  bool get isPalindrome {
    var cleaned = toLowerCase().replaceAll(' ', '');
    return cleaned == cleaned.split('').reversed.join('');
  }
}

void main() {
  print('hello'.reverse());        // olleh
  print('radar'.isPalindrome);     // true
}

Die Syntax lautet extension ExtensionName on Type. Darin definieren Sie Methoden und Getter genau wie in einer regulären Klasse. Einmal definiert, erscheinen diese Methoden auf allen Instanzen dieses Typs, als wären sie integriert.

Erweiterungen funktionieren für jeden Typ, einschließlich eigener Klassen und generischer Typen:

extension IntExtras on int {
  int squared() => this * this;
}

extension ListExtras<T> on List<T> {
  T? get secondOrNull => length >= 2 ? this[1] : null;
}

void main() {
  print(5.squared());                    // 25
  print([1, 2, 3].secondOrNull);         // 2
}

Beachten Sie, dass innerhalb einer Erweiterung this auf die Instanz verweist, auf der die Methode aufgerufen wird. Erweiterungen sind eine saubere Möglichkeit, bestehende Typen zu verbessern und gleichzeitig Ihren Code organisiert und lesbar zu halten.

challenge icon

Aufgabe

Einfach

Erweitere Darts integrierte Typen mit nützlichen Funktionen mithilfe von Erweiterungsmethoden! Du wirst Erweiterungen erstellen, die den Typen String und List hilfreiche Methoden hinzufügen, und sie anschließend in deiner Hauptdatei verwenden.

Du wirst deinen Code auf zwei Dateien aufteilen:

  • extensions.dart: Erstelle zwei Erweiterungen, die bestehenden Typen neue Funktionen hinzufügen:
    • Eine Erweiterung namens StringUtils für String mit:
      • Eine Methode countVowels(), die die Anzahl der Vokale (a, e, i, o, u – unabhängig von der Groß- und Kleinschreibung) im String zurückgibt
      • Einen Getter initials, der den ersten Buchstaben jedes Wortes (durch Leerzeichen getrennt) zurückgibt, zusammengefügt und in Großbuchstaben umgewandelt. Zum Beispiel wird "hello world" zu "HW"
    • Eine Erweiterung namens ListUtils<T> für List<T> mit:
      • Eine Methode safeGet(int index), die das Element am Index zurückgibt, wenn es existiert, oder null, wenn der Index außerhalb des gültigen Bereichs liegt
      • Einen Getter hasMultiple, der true zurückgibt, wenn die Liste mehr als ein Element enthält
  • main.dart: Importiere deine Erweiterungen und führe sie praktisch vor:
    • Erstelle den String "Object Oriented Programming" und gib seine Anzahl an Vokalen im Format Vowels: [count] aus
    • Gib die Initialen desselben Strings im Format Initials: [initials] aus
    • Erstelle eine Liste von Ganzzahlen [10, 20, 30]
    • Gib das Ergebnis von safeGet(1) im Format Element at 1: [value] aus
    • Gib das Ergebnis von safeGet(5) im Format Element at 5: [value] aus
    • Gib aus, ob die Liste mehrere Elemente enthält, im Format Has multiple: [true/false]

Denke daran, dass sich innerhalb einer Erweiterung this auf die Instanz bezieht, für die die Methode aufgerufen wird. Deine Erweiterungen lassen diese Typen so wirken, als hätten sie diese Methoden bereits integriert!

Erwartete Ausgabe:

Vowels: 9
Initials: OOP
Element at 1: 20
Element at 5: null
Has multiple: true

Probier es selbst

import 'extensions.dart';

void main() {
  // Erstelle den String
  String text = "Object Oriented Programming";

  // TODO: Gib die Anzahl der Vokale mit countVowels() aus
  // Format: Vowels: [count]

  // TODO: Gib die Initialen mit dem initials Getter aus
  // Format: Initials: [initials]

  // Erstelle die Liste von Ganzzahlen
  List<int> numbers = [10, 20, 30];

  // TODO: Gib das Ergebnis von safeGet(1) aus
  // Format: Element at 1: [value]

  // TODO: Gib das Ergebnis von safeGet(5) aus
  // Format: Element at 5: [value]

  // TODO: Gib aus, ob die Liste mehrere Elemente hat
  // Format: Has multiple: [true/false]
}
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