Menu
Coddy logo textTech

Tworzenie domieszek

Część sekcji Programowanie obiektowe ścieżki Dart w Coddy. Lekcja 51 z 110.

Skoro już wiesz, czym są miksy, przyjrzyjmy się, jak prawidłowo je tworzyć. Miks deklaruje się za pomocą słowa kluczowego mixin zamiast class.

mixin Logging {
  void log(String message) {
    print('[LOG] $message');
  }
  
  void logError(String error) {
    print('[ERROR] $error');
  }
}

Domieszki mogą zawierać metody, właściwości, a nawet gettery i settery — tak jak klasy. Obowiązuje jednak jedna ważna zasada: domieszki nie mogą mieć konstruktorów. Ponieważ domieszki są przeznaczone do „domieszania”, a nie do bezpośredniego tworzenia ich instancji, nie potrzebują logiki inicjalizacji.

mixin Timestamped {
  DateTime createdAt = DateTime.now();
  
  String get formattedTime => createdAt.toString();
  
  void printTimestamp() {
    print('Created at: $formattedTime');
  }
}

class Document with Timestamped {
  String title;
  Document(this.title);
}

void main() {
  var doc = Document('Report');
  doc.printTimestamp();  // Używa metody z miksinu
  print(doc.createdAt);  // Używa właściwości z miksinu
}

Gdy zastosujesz miksin za pomocą with, wszystkie jego składowe stają się częścią Twojej klasy. Klasa może korzystać z nich bezpośrednio, podobnie jak każdy kod, który ma instancję tej klasy. Dzięki temu miksiny są przejrzystym sposobem dodawania funkcjonalności wielokrotnego użytku bez złożoności hierarchii dziedziczenia.

challenge icon

Wyzwanie

Łatwy

Zbudujmy system wiadomości, który pokaże, jak tworzyć miksy z metodami, właściwościami i getterami. Zaprojektujesz miks dodający możliwości formatowania różnym typom wiadomości.

Podzielisz kod na dwa pliki:

  • messaging.dart: Zdefiniuj tutaj swój miks i klasy wiadomości:
    • Miks Formattable, który zawiera:
      • Właściwość String prefix zainicjalizowaną wartością '>>>'
      • Getter separator, który zwraca ' | '
      • Metodę format(String text), która zwraca ciąg [prefix][separator][text]
      • Metodę formatBold(String text), która zwraca **[text]**
    • Klasę TextMessage, która używa miksu Formattable. Dodaj właściwość String sender i konstruktor. Uwzględnij metodę send(String content), która wyświetla wynik wywołania format() z [sender]: [content]
    • Klasę AlertMessage, która również używa miksu Formattable. Dodaj właściwość String level i konstruktor. Uwzględnij metodę alert(String content), która wyświetla wynik wywołania format() z [[level]] [formatBold(content)]
  • main.dart: Zaimportuj plik z wiadomościami i pokaż, jak oba typy wiadomości zyskują możliwości formatowania dzięki miksowi:
    • Utwórz TextMessage z nadawcą 'Alice'
    • Utwórz AlertMessage z poziomem 'WARNING'
    • Wywołaj send('Hello there!') dla wiadomości tekstowej
    • Wywołaj alert('System overload') dla wiadomości alertowej

Twój miks pokazuje, że miksy mogą zawierać właściwości z wartościami domyślnymi, gettery obliczające wartości oraz wiele metod, które mogą nawet wywoływać się nawzajem. Obie klasy wiadomości zyskują całą tę funkcjonalność po prostu dzięki użyciu słowa kluczowego with.

Oczekiwany wynik:

>>> | Alice: Hello there!
>>> | [WARNING] **System overload**

Spróbuj swoich sił

import 'messaging.dart';

void main() {
  // TODO: Utwórz TextMessage z nadawcą 'Alice'
  
  // TODO: Utwórz AlertMessage z poziomem 'WARNING'
  
  // TODO: Wywołaj send('Hello there!') na wiadomości tekstowej
  
  // TODO: Wywołaj alert('System overload') na wiadomości alarmowej
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator Dart online