Sobes.tech
Junior

Care sunt diferențele dintre moștenire și compoziție în programarea orientată pe obiecte?

sobes.tech AI

Răspuns de la AI

Moștenire:

  • Relația "este un" (is-a).
  • Clasa derivată moștenește câmpurile și metodele clasei părinte.
  • Folosit pentru a crea versiuni specializate ale claselor existente.
  • Poate duce la ierarhii rigide și probleme cu moștenirea multiplă.

Compoziție:

  • Relația "are" (has-a).
  • Clasa conține instanțe ale altor clase ca și câmpuri.
  • Delegă executarea sarcinilor către obiectele conținute.
  • Oferă flexibilitate și posibilitatea de a înlocui componente.

Exemplu în Java:

// Moștenire
class Vehicle { // Clasă de bază
    void start() { /* ... */ }
}

class Car extends Vehicle { // Moștenește din Vehicle
    // Metode specifice pentru Car
}

// Compoziție
class Engine { // Component
    void start() { /* ... */ }
}

class AnotherCar { // Clasă care utilizează compoziția
    private Engine engine; // Conține o instanță de Engine

    AnotherCar(Engine engine) {
        this.engine = engine;
    }

    void start() {
        engine.start(); // Delegare
    }
}

Diferențele pot fi prezentate sub formă de tabel:

Criteriu Moștenire Compoziție
Relație "este un" (is-a) "are" (has-a)
Rigiditate Mai rigid Mai flexibil
Reutilizare Prin ierarhii de clase Prin instanțe de obiecte
Schimbare comportament Suprascrierea metodelor Înlocuirea obiectelor conținute
Aplicație Specializare, extindere funcționalitate Agregare, construcție din părți

Compoziția este în general preferată față de moștenire în majoritatea cazurilor pentru a obține o flexibilitate mai mare și o dependență mai mică între clase.