Sobes.tech
Junior

Quali sono le differenze tra ereditarietà e composizione nella programmazione orientata agli oggetti?

sobes.tech AI

Risposta dell'AI

Ereditarietà:

  • Relazione "è un" (is-a).
  • La classe figlia eredita campi e metodi della classe genitore.
  • Usata per creare versioni specializzate di classi esistenti.
  • Può portare a gerarchie rigide e problemi con l'ereditarietà multipla.

Composizione:

  • Relazione "ha" (has-a).
  • La classe contiene istanze di altre classi come suoi campi.
  • Delegare l'esecuzione di compiti agli oggetti contenuti.
  • Offre flessibilità e possibilità di sostituire i componenti.

Esempio in Java:

// Ereditarietà
class Vehicle { // Classe base
    void start() { /* ... */ }
}

class Car extends Vehicle { // Eredita da Vehicle
    // Metodi specifici di Car
}

// Composizione
class Engine { // Componente
    void start() { /* ... */ }
}

class AnotherCar { // Classe che utilizza composizione
    private Engine engine; // Contiene un'istanza di Engine

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

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

Le differenze possono essere rappresentate sotto forma di tabella:

Criterio Ereditarietà Composizione
Relazione "è un" (is-a) "ha" (has-a)
Rigidità Più rigido Più flessibile
Riutilizzo Attraverso gerarchie di classi Attraverso istanze di oggetti
Cambiamento di comportamento Sovrascrittura dei metodi Sostituzione degli oggetti contenuti
Applicazione Specializzazione, estensione di funzionalità Aggregazione, costruzione da parti

La composizione è generalmente preferibile all'ereditarietà nella maggior parte dei casi per ottenere maggiore flessibilità e minore dipendenza tra le classi.