Sobes.tech
Junior

Na czym polegają różnice między dziedziczeniem a kompozycją w programowaniu obiektowym?

sobes.tech AI

Odpowiedź od AI

Dziedziczenie:

  • Relacja "jest" (is-a).
  • Klasa potomna dziedziczy pola i metody klasy nadrzędnej.
  • Używane do tworzenia wyspecjalizowanych wersji istniejących klas.
  • Może prowadzić do sztywnych hierarchii i problemów z wielokrotnym dziedziczeniem.

Kompozycja:

  • Relacja "ma" (has-a).
  • Klasa zawiera instancje innych klas jako swoje pola.
  • Deleguje wykonywanie zadań do zawartych obiektów.
  • Zapewnia elastyczność i możliwość wymiany komponentów.

Przykład w Java:

// Dziedziczenie
class Vehicle { // Klasa bazowa
    void start() { /* ... */ }
}

class Car extends Vehicle { // Dziedziczy po Vehicle
    // Metody specyficzne dla Car
}

// Kompozycja
class Engine { // Składnik
    void start() { /* ... */ }
}

class AnotherCar { // Klasa korzystająca z kompozycji
    private Engine engine; // Zawiera instancję Engine

    AnotherCar(Engine engine) {
        this.engine = engine;
    }

    void start() {
        engine.start(); // Delegacja
    }
}

Różnice można przedstawić w formie tabeli:

Kryterium Dziedziczenie Kompozycja
Relacja "jest" (is-a) "ma" (has-a)
Sztywność Bardziej sztywne Bardziej elastyczne
Wykorzystanie ponowne Poprzez hierarchie klas Poprzez instancje obiektów
Zmiana zachowania Nadpisanie metod Wymiana zawartych obiektów
Zastosowanie Specjalizacja, rozszerzenie funkcji Agregacja, budowa z części

Kompozycja jest zazwyczaj preferowana nad dziedziczeniem w większości przypadków, aby osiągnąć większą elastyczność i mniejszą zależność między klasami.