BLOK 14 · 2 godz. OOP Dziedziczenie Polimorfizm

Programowanie obiektowe cz. 2: dziedziczenie i polimorfizm

Informatyka Rozszerzona · Klasa 4 · Semestr I · Blok 14/30

1. Dziedziczenie

Dziedziczenie pozwala tworzyć nową klasę (klasę pochodną) na bazie już istniejącej (klasy bazowej), przejmując jej pola i metody, i dodając lub modyfikując wybrane elementy. Unikamy w ten sposób powielania kodu.

class Pojazd: def __init__(self, marka, predkosc_max): self.marka = marka self.predkosc_max = predkosc_max def opisz(self): return f"{self.marka}, maks. {self.predkosc_max} km/h" class Samochod(Pojazd): # Samochod dziedziczy po Pojazd def __init__(self, marka, predkosc_max, liczba_drzwi): super().__init__(marka, predkosc_max) # wywołanie konstruktora klasy bazowej self.liczba_drzwi = liczba_drzwi samochod = Samochod("Toyota", 180, 5) print(samochod.opisz()) # metoda odziedziczona z Pojazd

2. Przesłanianie metod (override)

Klasa pochodna może zdefiniować metodę o tej samej nazwie co w klasie bazowej, aby zmienić jej działanie — to nazywamy przesłanianiem (ang. overriding).

class Motocykl(Pojazd): def opisz(self): # przesłonięta wersja metody opisz() return f"Motocykl {self.marka} — maks. {self.predkosc_max} km/h"

3. Polimorfizm

Polimorfizm oznacza, że obiekty różnych klas pochodzących z tej samej hierarchii mogą być traktowane jednolicie — wywołanie tej samej metody na różnych obiektach daje różne, właściwe dla każdej klasy, zachowanie.

pojazdy = [Samochod("Toyota", 180, 5), Motocykl("Honda", 220)] for p in pojazdy: print(p.opisz()) # każdy obiekt "wie", której wersji opisz() użyć

Dlaczego to jest przydatne?

Możemy napisać kod działający na ogólnym typie Pojazd, a program automatycznie wywoła właściwą wersję metody dla konkretnego obiektu — bez potrzeby pisania warunków if typ == "samochod".

4. Ćwiczenia praktyczne

Ćwiczenie 1 — hierarchia zwierząt

Stwórz klasę bazową Zwierze z metodą wydaj_dzwiek() zwracającą "...", a następnie klasy pochodne Pies i Kot, które przesłaniają tę metodę odpowiednio na "Hau!" i "Miau!". Wypisz dźwięki wszystkich zwierząt z listy w pętli.

class Zwierze: def wydaj_dzwiek(self): return "..." class Pies(Zwierze): def wydaj_dzwiek(self): return "Hau!" class Kot(Zwierze): def wydaj_dzwiek(self): return "Miau!" for zwierze in [Pies(), Kot()]: print(zwierze.wydaj_dzwiek())

Ćwiczenie 2 — rozbuduj Uczen (z Bloku 13)

Zdefiniuj klasę UczenTechnikum(Uczen), która dziedziczy po klasie Uczen i dodaje pole kwalifikacja (np. "INF.03"). Użyj super().__init__() w konstruktorze.

Sprawdź wiedzę

1. Do czego służy słowo kluczowe super() w konstruktorze klasy pochodnej?

2. Jak nazywa się sytuacja, gdy klasa pochodna definiuje metodę o tej samej nazwie co klasa bazowa, zmieniając jej działanie?

3. Co umożliwia polimorfizm?

Podsumowanie bloku