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.