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 AnimalTo 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.
Wyzwanie
ŁatwyZbudujmy 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
Vehiclez właściwościąString modeli 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
TurboBoostograniczony do klasyVehicleza pomocą słowa kluczowegoon. Ten miksin powinien mieć metodęactivateTurbo(), która wypisuje[model] TURBO ACTIVATED!, a następnie wywołujeaccelerate()(oba elementy są dostępne dzięki ograniczeniuon Vehicle) - Klasa
SportsCar, która rozszerzaVehiclei używa miksinuTurboBoost. 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!
- Klasa
main.dart: Zaimportuj plik vehicles i pokaż, jak działa ograniczony miksin:- Utwórz obiekt
SportsCarz modelem'Ferrari', prędkością320i kolorem'Red' - Wywołaj
showOff() - Wywołaj
activateTurbo()
- Utwórz obiekt
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/hSpró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()
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy OOP
Pliki zewnętrzneBiblioteki i importyWprowadzenie do OOPKlasy a obiektySłowo kluczowe thisMetodyZmienne instancjiPodstawy konstruktorówPowtórka – prosty kalkulator4Bezpieczeństwo wartości null
Wprowadzenie do bezpieczeństwa wartości nullTypy dopuszczające null i niedopuszczające nullOperatory ? i !Słowo kluczowe late a bezpieczeństwo wartości nullOperatory uwzględniające nullBezpieczeństwo wartości null w klasachPodsumowanie — system profili użytkowników7Klasy abstrakcyjne i interfejsy
Klasy abstrakcyjneMetody abstrakcyjneInterfejsy w DartInterfejsy niejawneImplementowanie a rozszerzanieWiele interfejsówPowtórka — kalkulator kształtów10Kolekcje i typy generyczne
Przegląd List, Set i MapKolekcje bezpieczne typowoKlasy generyczneMetody generyczneOgraniczenia typów generycznychIterable i IteratorPowtórka — generyczne przechowywanie danych13Zaawansowane koncepcje OOP
Kompozycja a dziedziczenieMetody rozszerzająceKlasy wywoływalneKlasy zapieczętowane (Dart 3)Rekordy (Dart 3)Wzorce i dopasowywanie (3.0)Typy wyliczeniowe z metodami16Projekt: Zarządzanie biblioteką
Omówienie projektuKlasy książek i użytkowników2Konstruktory w Dart
Konstruktor domyślnyKonstruktory nazwaneListy inicjalizująceKonstruktory stałeKonstruktory fabryczneKonstruktory przekierowującePodsumowanie — budowanie kształtów5Hermetyzacja
Elementy publiczne a prywatneKonwencja prefiksu _Prywatność na poziomie bibliotekiGettery i settery — szczegółowoUkrywanie informacjiPodsumowanie — dane uczniów8Domieszki
Wprowadzenie do domieszekTworzenie domieszekKorzystanie z wielu domieszekSłowo kluczowe on w domieszkachDomieszka a dziedziczenieDomieszka a interfejsPodsumowanie – system zwierząt11Metody specjalne
Nadpisanie toString()Nadpisanie hashCode i ==Interfejs ComparableMetoda call()Nadpisanie noSuchMethodPodsumowanie — własna kolekcja14Wzorce projektowe, część 1
Wprowadzenie do wzorców projektowychWzorzec SingletonWzorzec FactoryWzorzec ObserverWzorzec Strategy3Właściwości klas
Elementy instancji a elementy statycznePola final i constZmienne inicjalizowane z opóźnieniemMetody i pola statyczneGettery i setteryPowtórzenie – menedżer kont bankowych6Dziedziczenie
Podstawy dziedziczeniaSłowo kluczowe superPrzesłanianie metodAdnotacja @overrideSłowo kluczowe final dla klasKonstruktory i dziedziczeniePowtórzenie – hierarchia pracowników9Polimorfizm
Podstawy polimorfizmuPolimorfizm za pomocą interfejsówSprawdzanie typu w czasie działaniaOperatory is i asSłowo kluczowe covariantPodsumowanie — procesor płatnościPoćwicz samodzielnie: Kompilator Dart online