INF.04 · C# · lekcja 13

Dziedziczenie i klasy pochodne

Wspólna baza, osobne specjalizacje

  • Zrozum
  • Sprawdź
  • Napisz sam

Po tej lekcji: wspólna baza, osobne specjalizacje

Dzisiaj zrobisz konkretną rzecz

Dziedziczenie eliminuje powtarzanie tego samego kodu w wielu podobnych klasach — jedna z czterech głównych zasad OOP, obok hermetyzacji (Lekcja 11), polimorfizmu (Lekcja 14) i abstrakcji (Lekcja 15), i jeden z najczęściej sprawdzanych tematów na egzaminie INF.04.

Wszystkie pojazdy silnikowe (samochód, motocykl, ciężarówka) mają wspólne cechy (silnik, koła, prędkość maksymalna) opisane raz w "pojeździe bazowym", a każdy konkretny rodzaj dokłada coś swojego — ciężarówka dokłada ładowność, motocykl liczbę kół.

Sprawdź w działaniu

Wspólna baza, osobne specjalizacje

Najpierw przewidź wynik. Zmień dane w modelu i porównaj efekt. Spróbuj także przypadku granicznego, a nie tylko pierwszego poprawnego przykładu.

Ta interakcja wymaga włączonego JavaScriptu.

Model pokazuje wybraną zasadę. Nie uruchamia ani nie ocenia wklejonego kodu C#.

1. Przygotuj i uruchom własny projekt

2. Najpierw mały przykład

Wykonaj tę próbę przed dłuższym rozwiązaniem. Dwukropek po nazwie klasy oznacza dziedziczenie. Programista jest Pracownikiem i dodaje Jezyk. C# dopuszcza jedną bezpośrednią klasę bazową; implementowanych interfejsów może być wiele.

Program.cscsharp
var osoba = new Programista { Imie = "Ada", Jezyk = "C#" };
Console.WriteLine($"{osoba.Imie}: {osoba.Jezyk}");

class Pracownik { public string Imie { get; set; } = ""; }
class Programista : Pracownik
{
    public string Jezyk { get; set; } = "";
}
Wynik
Ada: C#
  1. Co sprawdzić? Zmień jedną wartość i przed uruchomieniem zapisz przewidywany rezultat. Porównaj go z opisem wyniku; przy błędzie wróć do konkretnej instrukcji.

Jak to działa — 1

Wyobraź sobie, że masz klasy Programista i Kierownik — obie mają imię i pensję, ale każda dokłada coś swojego. Bez dziedziczenia musiałbyś PRZEPISAĆ pola Imie i Pensja w każdej z nich osobno. Dziedziczenie pozwala napisać wspólną część RAZ, w jednej klasie bazowej.

Klasa bazowa (nadklasa) to klasa, z której inne klasy DZIEDZICZĄ — zawiera wspólne pola i metody. Klasa pochodna (podklasa) dziedziczy WSZYSTKO z klasy bazowej (poza prywatnymi polami) i może dodać własne, dodatkowe pola i metody.

Składnia dziedziczenia w C# — dwukropek po nazwie klasy pochodnej: class Programista : Pracownik { public string JezykProgramowania; } Klasa Programista automatycznie "ma" pola Imie i Pensja z klasy Pracownik, mimo że nie są zapisane bezpośrednio w Programista.

**Słowo kluczowe base** pozwala klasie pochodnej odwołać się do konstruktora lub metod klasy bazowej: public Programista(string imie, double pensja, string jezyk) : base(imie, pensja) { JezykProgramowania = jezyk; } To wywołuje najpierw konstruktor Pracownik (ustawiający Imie i Pensja), a potem dodaje własne pole JezykProgramowania.

Jak to działa — 2

Dziedziczenie modeluje relację "JEST RODZAJEM" — programista JEST RODZAJEM pracownika, kierownik JEST RODZAJEM pracownika. Jeśli relacja nie pasuje do "jest rodzajem", dziedziczenie prawdopodobnie nie jest właściwym narzędziem.

3. Pełny przykład — czytaj od Main

Teraz zastąp Program.cs tym programem. Zanim uruchomisz, znajdź dane wejściowe, operację i miejsce prezentacji wyniku. W tym wariancie zachowujemy jawny Main. Nie wklejaj kilku pełnych programów do jednego pliku.

Program.cs — osobne uruchomieniecsharp
using System;

class Pracownik
{
    public string Imie;
    public double Pensja;

    public Pracownik(string imie, double pensja)
    {
        Imie = imie;
        Pensja = pensja;
    }

    public void WyswietlInfo()
    {
        Console.WriteLine(Imie + " - pensja: " + Pensja + " zł");
    }
}

class Programista : Pracownik // dziedziczy z Pracownik
{
    public string JezykProgramowania;

    public Programista(string imie, double pensja, string jezyk) : base(imie, pensja)
    {
        JezykProgramowania = jezyk;
    }
}

class Program
{
    static void Main()
    {
        Programista dev = new Programista("Kasia", 8000, "C#");

        dev.WyswietlInfo(); // metoda ODZIEDZICZONA z klasy Pracownik
        Console.WriteLine("Język: " + dev.JezykProgramowania); // pole WŁASNE klasy Programista
    }
}
  1. Prześledź kod Zapis class Programista : Pracownik oznacza "Programista dziedziczy z Pracownik". Zwróć uwagę, że w Main() wywołujemy dev.WyswietlInfo(), mimo że ta metoda jest zdefiniowana TYLKO w klasie Pracownik — obiekt dev "otrzymał" ją automatycznie przez dziedziczenie. : base(imie, pensja) w konstruktorze Programista przekazuje te dwa parametry do konstruktora klasy bazowej Pracownik, żeby nie powtarzać przypisań Imie = imie; po raz drugi.

Sprawdź, zanim przepiszesz cały program

Częsty błąd to zapomnienie wywołania konstruktora bazowego przez : base(...), gdy klasa bazowa NIE MA konstruktora bezparametrowego — kompilator zgłosi błąd, bo nie wie, jak zainicjować odziedziczone pola. Drugi błąd: dziedziczenie "na siłę" tam, gdzie relacja nie jest logicznie "jest rodzajem" (np. dziedziczenie Silnik po Samochod, mimo że silnik nie JEST rodzajem samochodu, tylko jego CZĘŚCIĄ — to relacja kompozycji, inny temat). Trzeci: próba dostępu z klasy pochodnej do PRYWATNYCH pól klasy bazowej — dziedziczenie nie omija hermetyzacji, trzeba użyć protected zamiast private, jeśli klasa pochodna ma mieć bezpośredni dostęp.

Ćwiczenie z pomocą · samodzielna praca

4. Teraz Twoja zmiana

Zdefiniuj klasę bazową Zwierze z polem Imie i metodą WydajDzwiek(), oraz klasę pochodną Pies dodającą pole Rasa.

Oczekiwany rezultat
Spełnij warunki polecenia. Zapisz wejście, otrzymany wynik i wyjaśnij, która część kodu za niego odpowiada.
Potrzebujesz pomocy? Rozwiązuj krok po kroku.
Krok 1 — pokaż podpowiedź

Wróć do podstawowej formy oraz objaśnienia: Dwukropek po nazwie klasy oznacza dziedziczenie. Programista jest Pracownikiem i dodaje Jezyk. C# dopuszcza jedną bezpośrednią klasę bazową; implementowanych interfejsów może być wiele.

Krok 2 — pokaż podpowiedź

Zmień tylko część potrzebną do polecenia. Zachowaj działającą wersję przed zmianą i uruchamiaj po każdym małym etapie.

Krok 3 — pokaż podpowiedź

Sprawdź przypadek zwykły i graniczny; porównaj z regułą: Ada: C#

Otwórz tylko tyle podpowiedzi, ile potrzebujesz. Po każdym kroku wróć do zadania i sprawdź wynik.

5. Sprawdź rozumienie, nie tylko uruchomienie

Dalej na swoim koncie

Rozgrzewki, quiz i zadania są w biurku ucznia.

Teoria jest otwarta dla wszystkich. Żeby rozwiązywać zadania, zapisywać szkice i widzieć swój postęp, zaloguj się.

Zaloguj się →
Źródła i dalsza nauka