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.