Menu
Coddy logo textTech

Podstawy dziedziczenia

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

Dziedziczenie pozwala klasie przejąć właściwości i metody innej klasy. Zamiast przepisywać ten sam kod, tworzysz nową klasę, która bazuje na istniejącej. Oryginalna klasa nazywa się klasą nadrzędną (lub nadklasą), a nowa klasa to klasa potomna (lub podklasa).

W Dart używasz słowa kluczowego extends, aby dziedziczyć po klasie nadrzędnej:

class Animal {
  String name;
  
  Animal(this.name);
  
  void eat() {
    print('$name is eating');
  }
}

class Dog extends Animal {
  Dog(String name) : super(name);
  
  void bark() {
    print('$name says woof!');
  }
}

void main() {
  var dog = Dog('Buddy');
  dog.eat();   // Odziedziczone po Animal
  dog.bark();  // Zdefiniowane w Dog
}

Klasa Dog automatycznie ma dostęp do właściwości name i metody eat() z klasy Animal, a także do własnej metody bark(). Tworzy to relację „jest” — Dog jest Animal.

Klasa potomna może dodawać nowe właściwości i metody, ale dziedziczy wszystko, co publiczne, z klasy nadrzędnej. Pamiętaj, że składowe prywatne (te z _) nie są bezpośrednio dostępne w podklasach z innych bibliotek, choć nadal istnieją w odziedziczonym obiekcie.

challenge icon

Wyzwanie

Łatwy

Zbudujmy system pojazdów, który pokaże, jak dziedziczenie pozwala klasom potomnym ponownie wykorzystywać i rozszerzać funkcjonalność klas nadrzędnych. Utworzysz klasę nadrzędną dla ogólnych pojazdów oraz klasę potomną dla konkretnego typu pojazdu.

Uporządkujesz kod w dwóch plikach:

  • vehicle.dart: Zdefiniuj tutaj swoje klasy:
    • Klasa Vehicle (nadrzędna) z właściwością String brand, konstruktorem przyjmującym markę oraz metodą start(), która wyświetla [brand] engine starting...
    • Klasa Motorcycle, która rozszerza klasę Vehicle. Powinna mieć dodatkową właściwość int cc (pojemność skokowa silnika), konstruktor przyjmujący zarówno markę, jak i cc (przekazujący markę klasie nadrzędnej za pomocą super) oraz własną metodę wheelie(), która wyświetla [brand] is doing a wheelie!
  • main.dart: Zaimportuj plik pojazdu i pokaż działanie dziedziczenia:
    • Utwórz obiekt Vehicle o marce 'Toyota'
    • Wywołaj jego metodę start()
    • Utwórz obiekt Motorcycle o marce 'Harley' i cc 1200
    • Wywołaj metodę start() motocykla (odziedziczoną z klasy Vehicle)
    • Wywołaj metodę wheelie() motocykla (zdefiniowaną w klasie Motorcycle)
    • Wyświetl Motorcycle engine: [cc]cc, aby pokazać własną właściwość klasy potomnej

Zwróć uwagę, jak klasa Motorcycle automatycznie uzyskuje dostęp do właściwości brand i metody start() z klasy Vehicle, a jednocześnie ma własną, unikatową właściwość cc i metodę wheelie(). Na tym polega siła dziedziczenia — budowaniu na istniejącym kodzie.

Oczekiwany wynik:

Toyota engine starting...
Harley engine starting...
Harley is doing a wheelie!
Motorcycle engine: 1200cc

Spróbuj swoich sił

import 'vehicle.dart';

void main() {
  // TODO: Utwórz obiekt Vehicle z marką 'Toyota'
  
  // TODO: Wywołaj metodę start() pojazdu
  
  // TODO: Utwórz obiekt Motorcycle z marką 'Harley' i cc 1200
  
  // TODO: Wywołaj metodę start() motocykla (odziedziczoną po Vehicle)
  
  // TODO: Wywołaj metodę wheelie() motocykla
  
  // TODO: Wypisz 'Motorcycle engine: [cc]cc', używając właściwości cc motocykla
}
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