Dziedziczenie w C

1. Wprowadzenie

  • Dziedziczenie to jeden z podstawowych filarów programowania obiektowego.
  • Pozwala tworzyć nowe klasy na bazie istniejących, dziedzicząc ich funkcjonalność.
  • Klasa bazowa (nadrzędna) – klasa, z której dziedziczymy.
  • Klasa pochodna (podrzędna) – klasa, która dziedziczy z klasy bazowej.
  • Dziedziczenie umożliwia:
    • Ponowne wykorzystanie kodu (reusability),
    • Rozszerzanie funkcjonalności istniejących klas,
    • Tworzenie hierarchii klas.

2. Składnia dziedziczenia

Przykład:

Wynik:

Burek je.
Burek szczeka!

3. Dostęp do członków klasy bazowej

  • public – dostępne wszędzie, w tym w klasach pochodnych.
  • protected – dostępne tylko w klasie bazowej i klasach pochodnych.
  • private – dostępne tylko w klasie bazowej (niedostępne dla klas pochodnych).

4. Konstruktory w dziedziczeniu

  • Konstruktor klasy bazowej jest wywoływany przed konstruktorem klasy pochodnej.
  • Można wywołać konkretny konstruktor klasy bazowej używając słowa kluczowego base.

Przykład bez base:

Wynik:

Konstruktor Zwierze
Konstruktor Pies

Przykład z base:

Wynik:

Zwierze: Burek
Pies: Owczarek

5. Słowo kluczowe base

  • base odnosi się do klasy bazowej.
  • Używane do:
    • Wywoływania konstruktora klasy bazowej,
    • Wywoływania metod klasy bazowej przesłoniętych w klasie pochodnej.

6. Przesłanianie metod – virtual, override, new

6.1. virtual i override

  • virtual – metoda w klasie bazowej, którą można przesłonić.
  • override – przesłonięcie metody wirtualnej w klasie pochodnej.

6.2. new (ukrywanie metod)

  • new – ukrywa metodę klasy bazowej zamiast ją przesłaniać.
  • Metoda nie jest wirtualna i nie uczestniczy w polimorfizmie.

7. Klasy abstrakcyjne (abstract)

  • Klasa abstrakcyjna to klasa, której nie można bezpośrednio instancjonować.
  • Może zawierać metody abstrakcyjne (bez implementacji), które muszą być zaimplementowane w klasach pochodnych.
  • Używa się do tworzenia ogólnych szablonów.

Składnia:

Przykład:


8. Klasy zapieczętowane (sealed)

  • sealed – klasa, z której nie można dziedziczyć.
  • Używane do zapobiegania dalszemu rozszerzaniu klasy.

9. Dziedziczenie wielokrotne – BRAK w C

  • C# nie obsługuje dziedziczenia wielokrotnego (jedna klasa nie może dziedziczyć z wielu klas).
  • Zamiast tego używa się interfejsów (omówione w kolejnej lekcji).

10. Hierarchia dziedziczenia

  • Dziedziczenie tworzy hierarchię klas.
  • Przykład:
Zwierze
  ├── Ssak
  │    ├── Pies
  │    ├── Kot
  ├── Ptak
       ├── Orzel
       ├── Wrobel

11. Przykładowy program

Wynik:

Toyota z 4 kołami jedzie po drodze.
Jacht płynie po wodzie.

12. Najlepsze praktyki

  • Używaj dziedziczenia do modelowania relacji „jest" (np. Pies jest Zwierzęciem).
  • Preferuj kompozycję nad dziedziczeniem w przypadku relacji „ma".
  • Używaj klas abstrakcyjnych do tworzenia ogólnych szablonów.
  • Używaj sealed tylko wtedy, gdy jest pewność, że klasa nie będzie rozszerzana.
  • Nie twórz zbyt głębokich hierarchii – utrudniają one zrozumienie kodu.