Konstruktory i dziedziczenie
Część sekcji Programowanie obiektowe ścieżki Dart w Coddy. Lekcja 41 z 110.
Gdy klasa potomna rozszerza klasę nadrzędną, należy wywołać konstruktor klasy nadrzędnej, aby prawidłowo zainicjalizować odziedziczone pola. Dart zapewnia elastyczne sposoby obsługi tego za pomocą listy inicjalizacyjnej i super.
Jeśli klasa nadrzędna ma konstruktor z parametrami, klasa potomna musi wywołać go jawnie:
class Person {
String name;
int age;
Person(this.name, this.age);
}
class Student extends Person {
String school;
Student(String name, int age, this.school) : super(name, age);
}W Dart 2.17 wprowadzono parametry super — czytelniejszą składnię, która przekazuje parametry bezpośrednio do konstruktora klasy nadrzędnej:
class Student extends Person {
String school;
// super.name i super.age są przekazywane bezpośrednio do konstruktora Person
Student(super.name, super.age, this.school);
}Podczas pracy z konstruktorami nazwanymi określasz, który konstruktor klasy nadrzędnej wywołać:
class Employee extends Person {
String department;
Employee(super.name, super.age, this.department);
Employee.intern(String name, this.department) : super(name, 18);
}Kluczowa zasada jest prosta: klasa nadrzędna musi zostać w pełni zainicjalizowana, zanim klasa potomna doda własne właściwości. Niezależnie od tego, czy używasz tradycyjnego wywołania super(), czy nowszych parametrów super, Dart dba o to, by łańcuch dziedziczenia został poprawnie skonstruowany od klasy nadrzędnej do potomnej.
Wyzwanie
ŁatwyZbudujmy system inwentaryzacji produktów, który pokazuje, jak działają konstruktory z dziedziczeniem. Utworzysz hierarchię, w której różne typy produktów rozszerzają bazową klasę produktu, a każdy z nich wymaga prawidłowej inicjalizacji za pomocą konstruktorów klasy nadrzędnej.
Podzielisz swój kod na dwa pliki:
product.dart: Zdefiniuj tutaj hierarchię produktów:- Klasa
Productz właściwościamiString nameidouble price, konstruktorem przyjmującym obie wartości oraz metodąinfo(), która wyświetla[name]: $[price] - Klasa
Book, która rozszerzaProducti dodaje właściwośćString author. Użyj parametrówsuper, aby przekazaćnameipricedo konstruktora klasy nadrzędnej - Klasa
Electronics, która rozszerzaProducti dodaje właściwośćint warranty(w miesiącach). Użyj tradycyjnego wywołaniasuper()na liście inicjalizacyjnej, aby przekazać wartości do klasy nadrzędnej
- Klasa
main.dart: Zaimportuj plik z produktami i pokaż oba sposoby dziedziczenia konstruktorów:- Utwórz obiekt
Booko nazwie'Dart Essentials', cenie29.99i autorze'Jane Smith' - Wywołaj jego metodę
info(), a następnie wyświetlAuthor: [author] - Wyświetl pustą linię
- Utwórz obiekt
Electronicso nazwie'Wireless Mouse', cenie45.50i okresie gwarancji24 - Wywołaj jego metodę
info(), a następnie wyświetlWarranty: [warranty] months
- Utwórz obiekt
Obie klasy potomne dziedziczą metodę info() z klasy Product, bez konieczności jej nadpisywania. Kluczowa różnica polega na sposobie wywołania konstruktora klasy nadrzędnej — Book używa czytelniejszej składni parametrów super, natomiast Electronics stosuje tradycyjne podejście, wywołując super() na liście inicjalizacyjnej.
Oczekiwany wynik:
Dart Essentials: $29.99
Author: Jane Smith
Wireless Mouse: $45.5
Warranty: 24 monthsSpróbuj swoich sił
import 'product.dart';
void main() {
// TODO: Utwórz obiekt Book z następującymi danymi:
// - name: 'Dart Essentials'
// - price: 29.99
// - author: 'Jane Smith'
// TODO: Wywołaj metodę info() obiektu book
// TODO: Wypisz "Author: [author]"
// TODO: Wypisz pustą linię
// TODO: Utwórz obiekt Electronics z następującymi danymi:
// - name: 'Wireless Mouse'
// - price: 45.50
// - warranty: 24
// TODO: Wywołaj metodę info() obiektu electronics
// TODO: Wypisz "Warranty: [warranty] months"
}
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