Menu
Coddy logo textTech

Słowo kluczowe on w domieszkach

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

Czasami mixin musi używać metod lub właściwości klasy, do której jest dodawany. Słowo kluczowe on pozwala ograniczyć użycie mixina wyłącznie do klas rozszerzających określony typ.

class Animal {
  String name;
  Animal(this.name);
  
  void breathe() => print('$name is breathing');
}

mixin Swimming on Animal {
  void swim() {
    print('$name is swimming');  // Może uzyskać dostęp do 'name' z Animal
    breathe();  // Może wywoływać metody Animal
  }
}

class Fish extends Animal with Swimming {
  Fish(String name) : super(name);
}

Deklaracja on Animal oznacza, że ten mixin można zastosować tylko do klas rozszerzających Animal. Dzięki temu mixin ma dostęp do składowych klasy Animal. Bez on mixin nie wiedziałby, że istnieją name lub breathe().

Jeśli spróbujesz użyć ograniczonego miksinu w niezgodnej klasie, Dart zgłosi błąd kompilacji:

class Robot with Swimming {}  // Błąd! Robot nie dziedziczy po Animal

To ograniczenie jest przydatne, gdy działanie Twojego mixinu zależy od określonych możliwości klasy bazowej. Tworzy bezpieczniejszy kontrakt — mixin zapewnia określone zachowanie, ale tylko wtedy, gdy ma podstawę niezbędną do prawidłowego działania.

challenge icon

Wyzwanie

Łatwy

Zbudujmy system pojazdów, który pokazuje, jak słowo kluczowe on ogranicza użycie miksinów do określonych klas bazowych. Utworzysz miksin dodający funkcję turbo, ale będą mogły go używać tylko klasy rozszerzające klasę bazową Vehicle.

Podzielisz kod na dwa pliki:

  • vehicles.dart: Zdefiniuj tutaj klasę bazową, ograniczony miksin i typy pojazdów:
    • Klasa Vehicle z właściwością String model i właściwością int speed. Dodaj konstruktor przyjmujący obie wartości. Dodaj metodę accelerate(), która wypisuje [model] accelerating to [speed] km/h
    • Miksin TurboBoost ograniczony do klasy Vehicle za pomocą słowa kluczowego on. Ten miksin powinien mieć metodę activateTurbo(), która wypisuje [model] TURBO ACTIVATED!, a następnie wywołuje accelerate() (oba elementy są dostępne dzięki ograniczeniu on Vehicle)
    • Klasa SportsCar, która rozszerza Vehicle i używa miksinu TurboBoost. Dodaj właściwość String color. Konstruktor powinien przyjmować model, prędkość i kolor. Dodaj metodę showOff(), która wypisuje [color] [model] ready to race!
  • main.dart: Zaimportuj plik vehicles i pokaż, jak działa ograniczony miksin:
    • Utwórz obiekt SportsCar z modelem 'Ferrari', prędkością 320 i kolorem 'Red'
    • Wywołaj showOff()
    • Wywołaj activateTurbo()

Miksin TurboBoost może uzyskać dostęp do model i wywołać accelerate(), ponieważ deklaracja on Vehicle gwarantuje, że zostanie użyty wyłącznie w klasach rozszerzających Vehicle. Tworzy to bezpieczny kontrakt, dzięki któremu miksin wie dokładnie, jakie możliwości są dostępne.

Oczekiwany wynik:

Red Ferrari ready to race!
Ferrari TURBO ACTIVATED!
Ferrari accelerating to 320 km/h

Spróbuj swoich sił

import 'vehicles.dart';

void main() {
  // TODO: Utwórz SportsCar z modelem 'Ferrari', prędkością 320 i kolorem 'Red'
  
  // TODO: Wywołaj showOff()
  
  // TODO: Wywołaj activateTurbo()
}
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