Menu
Coddy logo textTech

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.

challenge icon

Wyzwanie

Łatwy

Zbudujmy 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 Product z właściwościami String name i double price, konstruktorem przyjmującym obie wartości oraz metodą info(), która wyświetla [name]: $[price]
    • Klasa Book, która rozszerza Product i dodaje właściwość String author. Użyj parametrów super, aby przekazać name i price do konstruktora klasy nadrzędnej
    • Klasa Electronics, która rozszerza Product i dodaje właściwość int warranty (w miesiącach). Użyj tradycyjnego wywołania super() na liście inicjalizacyjnej, aby przekazać wartości do klasy nadrzędnej
  • main.dart: Zaimportuj plik z produktami i pokaż oba sposoby dziedziczenia konstruktorów:
    • Utwórz obiekt Book o nazwie 'Dart Essentials', cenie 29.99 i autorze 'Jane Smith'
    • Wywołaj jego metodę info(), a następnie wyświetl Author: [author]
    • Wyświetl pustą linię
    • Utwórz obiekt Electronics o nazwie 'Wireless Mouse', cenie 45.50 i okresie gwarancji 24
    • Wywołaj jego metodę info(), a następnie wyświetl Warranty: [warranty] months

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 months

Spró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"
}
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