Menu
Coddy logo textTech

Domieszka a dziedziczenie

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

Skoro już wiesz, jak działają miksy, wyjaśnijmy, kiedy używać ich zamiast dziedziczenia. Kluczowa różnica polega na relacji, którą wyrażają.

Dziedziczenie reprezentuje relację „jest”. Dog jest Animal. Podklasa jest wyspecjalizowaną wersją klasy nadrzędnej i możesz rozszerzyć tylko jedną klasę.

Mixin z kolei reprezentują relację typu „potrafi coś robić”. Dog potrafi pływać, ale pływanie nie definiuje psa.

// Dziedziczenie: Dog JEST Animal
class Animal {
  String name;
  Animal(this.name);
}

class Dog extends Animal {
  Dog(String name) : super(name);
}

// Mixin: Dog POTRAFI pływać (ale umiejętność pływania go nie definiuje)
mixin Swimming {
  void swim() => print('Swimming');
}

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

Używaj dziedziczenia, gdy klasy mają wspólną podstawową tożsamość i potrzebujesz konstruktorów w klasie nadrzędnej. Używaj mixinów, gdy chcesz dodać możliwości klasom, które nie mają wspólnego przodka.

CechaDziedziczenieMiksyna
Relacjajest rodzajemmoże wykonywać
OgraniczenieTylko jeden rodzicWiele miksyn
KonstruktoryDozwoloneNiedozwolone
ZastosowanieSpecjalizacjaWspółdzielone zachowanie

Najlepsze jest to, że możesz połączyć oba podejścia — rozszerzyć jedną klasę i dodać wiele możliwości, zapewniając klasom dokładnie te funkcje, których potrzebują.

challenge icon

Wyzwanie

Łatwy

Zbudujmy system pracowników, który pokazuje, kiedy używać dziedziczenia, a kiedy miksinów. Utworzysz klasę bazową opisującą relację „jest czymś” oraz miksiny reprezentujące możliwości („potrafi coś zrobić”), a następnie połączysz je, aby pokazać, jak oba podejścia współdziałają.

Podzielisz kod na trzy pliki:

  • worker.dart: Zdefiniuj klasę bazową, która określa podstawową tożsamość wszystkich pracowników:
    • Klasa Worker z właściwościami String name i String department. Dodaj konstruktor przyjmujący obie wartości. Dodaj metodę introduce(), która wyświetla [name] works in [department]
  • skills.dart: Zdefiniuj miksiny reprezentujące możliwości, jakie mogą mieć pracownicy (relacje „potrafi coś zrobić”):
    • Miksin CanCode z metodą writeCode(), która wyświetla Writing code...
    • Miksin CanDesign z metodą createDesign(), która wyświetla Creating design...
    • Miksin CanManage z metodą leadTeam(), która wyświetla Leading the team...
  • main.dart: Zaimportuj oba pliki i utwórz wyspecjalizowane typy pracowników, łącząc dziedziczenie z miksinami:
    • Klasę Developer, która dziedziczy po Worker i używa miksinu CanCode
    • Klasę TechLead, która dziedziczy po Worker i używa miksinów CanCode oraz CanManage
    • Utwórz obiekt Developer o imieniu 'Alice' z działu 'Engineering'
    • Utwórz obiekt TechLead o imieniu 'Bob' z działu 'Engineering'
    • Dla Alice: wywołaj introduce(), a następnie writeCode()
    • Wyświetl pusty wiersz
    • Dla Boba: wywołaj introduce(), następnie writeCode(), a na końcu leadTeam()

Zauważ, że zarówno Developer, jak i TechLead są pracownikami (dziedziczenie), ale potrafią robić różne rzeczy (miksiny). Klasa TechLead łączy wiele możliwości bez potrzeby stosowania wielokrotnego dziedziczenia.

Oczekiwany wynik:

Alice works in Engineering
Writing code...

Bob works in Engineering
Writing code...
Leading the team...

Spróbuj swoich sił

import 'worker.dart';
import 'skills.dart';

// TODO: Utwórz klasę Developer, która dziedziczy po Worker i korzysta z miksinu CanCode

// TODO: Utwórz klasę TechLead, która dziedziczy po Worker i korzysta z miksinów CanCode oraz CanManage

void main() {
  // TODO: Utwórz obiekt Developer o imieniu 'Alice' w dziale 'Engineering'
  
  // TODO: Wywołaj introduce(), a następnie writeCode() dla Alice
  
  // TODO: Wypisz pustą linię
  
  // TODO: Utwórz obiekt TechLead o imieniu 'Bob' w dziale 'Engineering'
  
  // TODO: Wywołaj introduce(), writeCode(), a następnie leadTeam() dla Bob
}
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