Menu
Coddy logo textTech

Wprowadzenie do domieszek

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

Dowiedziałeś się, że Dart pozwala dziedziczyć tylko po jednej klasie i chociaż możesz implementować wiele interfejsów, cały kod musisz napisać samodzielnie. A co, jeśli chcesz współdzielić rzeczywisty kod implementacji między wieloma niepowiązanymi klasami? Właśnie do tego służą domieszki.

Miksin to sposób na ponowne wykorzystanie kodu w wielu hierarchiach klas. Możesz myśleć o nim jak o zestawie metod i właściwości, które możesz „domieszać” do dowolnej klasy, nadając jej nowe możliwości bez użycia dziedziczenia.

mixin Swimming {
  void swim() {
    print('Swimming through the water');
  }
}

class Duck with Swimming {
  void quack() {
    print('Quack!');
  }
}

class Fish with Swimming {
  void blowBubbles() {
    print('Blub blub');
  }
}

void main() {
  var duck = Duck();
  duck.quack();
  duck.swim();  // Z mixinu
  
  var fish = Fish();
  fish.swim();  // Ta sama implementacja, inna klasa
}

Zwróć uwagę na słowo kluczowe with — w ten sposób stosujesz domieszkę do klasy. W przeciwieństwie do implements nie musisz samodzielnie pisać metody. Domieszka udostępnia właściwy kod, a Twoja klasa automatycznie zyskuje tę funkcjonalność.

Mixin rozwiązują rzeczywisty problem: Duck i Fish nie są powiązane przez dziedziczenie, a jednak oba potrzebują zachowania umożliwiającego pływanie. Dzięki mixinom piszesz kod raz i udostępniasz go wszędzie tam, gdzie jest potrzebny.

challenge icon

Wyzwanie

Łatwy

Zbudujmy system instrumentów muzycznych, który pokazuje, jak mixiny pozwalają współdzielić zachowanie między niepowiązanymi klasami. Utworzysz mixin zapewniający funkcje strojenia, a następnie zastosujesz go do różnych instrumentów, które nie są ze sobą powiązane przez dziedziczenie.

Podzielisz swój kod na dwa pliki:

  • instruments.dart: Zdefiniuj tutaj swój mixin i klasy instrumentów:
    • Mixin Tunable z metodą tune(), która wyświetla Tuning the instrument..., oraz metodą checkTuning(), która wyświetla Tuning is perfect!
    • Klasa Guitar, która używa mixinu Tunable. Dodaj właściwość String brand i konstruktor. Dodaj metodę strum(), która wyświetla [brand] guitar strumming chords
    • Klasa Piano, która również używa mixinu Tunable. Dodaj właściwość int keys i konstruktor. Dodaj metodę play(), która wyświetla Playing [keys]-key piano
  • main.dart: Zaimportuj plik z instrumentami i pokaż, jak oba niepowiązane instrumenty zyskują możliwość strojenia dzięki temu samemu mixinowi:
    • Utwórz obiekt Guitar z marką 'Fender'
    • Utwórz obiekt Piano z 88 klawiszami
    • Dla gitary: wywołaj tune(), następnie strum(), a potem checkTuning()
    • Wyświetl pusty wiersz
    • Dla pianina: wywołaj tune(), następnie play(), a potem checkTuning()

Zwróć uwagę, że Guitar i Piano to zupełnie różne instrumenty, które nie są powiązane dziedziczeniem, a mimo to oba zyskują dokładnie te same metody strojenia z mixinu Tunable. Kod strojenia piszesz raz, a obie klasy mogą z niego korzystać dzięki słowu kluczowemu with.

Oczekiwany wynik:

Tuning the instrument...
Fender guitar strumming chords
Tuning is perfect!

Tuning the instrument...
Playing 88-key piano
Tuning is perfect!

Spróbuj swoich sił

import 'instruments.dart';

void main() {
  // TODO: Utwórz Guitar marki 'Fender'
  
  // TODO: Utwórz Piano z 88 klawiszami
  
  // TODO: Dla gitary: wywołaj tune(), następnie strum(), a potem checkTuning()
  
  // TODO: Wypisz pustą linię
  
  // TODO: Dla pianina: wywołaj tune(), następnie play(), a potem checkTuning()
}
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