Sobes.tech
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.