Sobes.tech
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-a vzťah): Vzťah "je". Podtrieda rozširuje alebo špecifikuje správanie nadtriedy. Potomok dedí polia a metódy rodičovskej triedy.
  • Skladanie (has-a vzť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.