Junior
Jaké jsou rozdíly mezi dědičností a kompozicí v objektově orientovaném programování?
sobes.tech AI
Odpověď od AI
Dědičnost:
- Vztah "je" (is-a).
- Potomková třída dědí pole a metody třídy rodiče.
- Používá se k vytváření specializovaných verzí stávajících tříd.
- Může vést k rigidním hierarchiím a problémům s vícenásobnou dědičností.
Složení:
- Vztah "má" (has-a).
- Třída obsahuje instance jiných tříd jako svá pole.
- Deleguje vykonávání úkolů na obsahové objekty.
- Nabízí flexibilitu a možnost výměny komponent.
Příklad v Javě:
// Dědičnost
class Vehicle { // Základní třída
void start() { /* ... */ }
}
class Car extends Vehicle { // Dědí od Vehicle
// Specifické metody Car
}
// Složení
class Engine { // Složka
void start() { /* ... */ }
}
class AnotherCar { // Třída využívající složení
private Engine engine; // Obsahuje instanci Engine
AnotherCar(Engine engine) {
this.engine = engine;
}
void start() {
engine.start(); // Delegace
}
}
Rozdíly lze představit ve formě tabulky:
| Kritérium | Dědičnost | Složení |
|---|---|---|
| Vztah | "je" (is-a) | "má" (has-a) |
| Pevnost | Více rigidní | Flexibilnější |
| Opětovné použití | Přes hierarchie tříd | Přes instance objektů |
| Změna chování | Přepsání metod | Nahrazení obsahových objektů |
| Použití | Specializace, rozšíření funkce | Sestavení z částí |
Složení je obecně preferováno před dědičností ve většině případů pro dosažení větší flexibility a menší závislosti mezi třídami.