Sobes.tech
Junior

Czym są dziedziczenie i polimorfizm w typach danych referencyjnych?

sobes.tech AI

Odpowiedź od AI

Dziedziczenie to mechanizm umożliwiający nowej klasie (podklasie/klasie pochodnej) dziedziczenie właściwości (pól) i zachowań (metod) istniejącej klasy (klasy nadrzędnej/rodzica), rozszerzając lub nadpisując funkcjonalność. Sprzyja to ponownemu użyciu kodu i ustanawia relacje "jest" (is-a).

Polimorfizm to możliwość obiektów różnych klas do reagowania na tę samą nazwę metody w różny sposób, w zależności od ich konkretnego typu podczas wykonywania. Zapewnia elastyczność i rozszerzalność kodu, pozwalając na obsługę obiektów podklas przez odwołanie do klasy nadrzędnej.

W typach danych referencyjnych (klasach) te koncepcje odgrywają kluczową rolę:

  • Dziedziczenie: Podklasa ma dostęp do członków klasy nadrzędnej i może dodawać własne lub zmieniać zachowanie odziedziczonych metod (nadpisanie - overriding). Obiekt podklasy może być używany wszędzie tam, gdzie oczekiwany jest obiekt klasy nadrzędnej.
  • Polimorfizm: Różne obiekty związane z tą samą hierarchią dziedziczenia mogą być obsługiwane tym samym kodem, wywołując tę samą metodę, ale implementacja tej metody będzie specyficzna dla konkretnego typu obiektu podczas wykonywania.

Przykład w Java:

// Klasa nadrzędna (superklasa)
class Animal {
    public void makeSound() {
        System.out.println("Wydaje dźwięk");
    }
}

// Klasa pochodna (podklasa), dziedzicząca po Animal
class Dog extends Animal {
    // Nadpisanie metody z klasy nadrzędnej
    @Override
    public void makeSound() {
        System.out.println("Hau!");
    }
}

// Klasa pochodna (podklasa), dziedzicząca po Animal
class Cat extends Animal {
    // Nadpisanie metody z klasy nadrzędnej
    @Override
    public void makeSound() {
        System.out.println("Miau!");
    }
}

// Przykład polimorfizmu
public class PolymorphismExample {
    public static void main(String[] args) {
        Animal myAnimal = new Animal(); // obiekt klasy nadrzędnej
        Animal myDog = new Dog();       // obiekt klasy pochodnej, odwołanie do klasy nadrzędnej
        Animal myCat = new Cat();       // obiekt klasy pochodnej, odwołanie do klasy nadrzędnej

        myAnimal.makeSound(); // Wypisze: Wydaje dźwięk
        myDog.makeSound();    // Wypisze: Hau! (polimorfizm - wywołanie metody Dog)
        myCat.makeSound();    // Wypisze: Miau! (polimorfizm - wywołanie metody Cat)
    }
}