Junior
Aký je rozdiel medzi kompozíciou a dedičstvom?
sobes.tech AI
Odpoveď od AI
Skladba a dedičstvo sú dva hlavné mechanizmy opakovného použitia kódu v OOP, ale predstavujú rôzne typy vzťahov medzi triedami:
- Dedičstvo (
is-avzťah): Vzťah "je". Podtrieda rozširuje alebo špecifikuje správanie nadtriedy. Potomok dedí polia a metódy rodičovskej triedy. - Skladanie (
has-avzťah): Vzťah "má". Trieda obsahuje inštancie iných tried ako svoje členy. Deleguje časť svojho správania týmto obsahujúcim objektom.
Hlavné rozdiely:
| Vlastnosť | Dedičstvo | Skladanie |
|---|---|---|
| Vzťah | is-a (je) | has-a (má) |
| Flexibilita | Menej flexibilné (pevná hierarchia) | Viac flexibilné (komponenty je možné meniť) |
| Prepojenie | Silné prepojenie medzi triedami | Slabé prepojenie medzi triedami |
| Polymorfizmus | Dosiahnutý prepísaním | Dosiahnutý delegovaním |
| Zmeny | Zmeny v rodičovskej triede môžu narušiť potomkov | Zmeny v obsahujúcej triede majú menší vplyv na ostatné |
| Zložitosť | Môže viesť k "problému krehkej základnej triedy" | Jednoduchšia organizácia kódu |
Príklad dedičstva:
class Animal {
void eat() {
// ...
}
}
class Dog extends Animal { // Pes je zviera
void bark() {
// ...
}
}
Príklad skladania:
class Engine {
void start() {
// ...
}
}
class Car {
private Engine engine; // Auto má motor
public Car() {
this.engine = new Engine();
}
void startCar() {
engine.start(); // Delegácia
}
}
Vo všeobecnosti je skladanie v mnohých prípadoch preferovanejšie ako dedičstvo, pretože poskytuje väčšiu flexibilitu a znižuje prepojenie medzi triedami. Dedičstvo by sa malo používať, keď existuje jasne definovaný vzťah "je" a podtrieda skutočne rozširuje funkčnosť základnej triedy.