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.
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.
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; } = "";
}
Ada: C#
- 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.
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
}
}
- Prześledź kod Zapis
class Programista : Pracownikoznacza "Programista dziedziczy z Pracownik". Zwróć uwagę, że wMain()wywołujemydev.WyswietlInfo(), mimo że ta metoda jest zdefiniowana TYLKO w klasiePracownik— obiektdev"otrzymał" ją automatycznie przez dziedziczenie.: base(imie, pensja)w konstruktorzeProgramistaprzekazuje te dwa parametry do konstruktora klasy bazowejPracownik, ż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.
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ę →