La composizione sull’ereditarietà è una metodologia di programmazione utilizzata nei linguaggi di programmazione orientati agli oggetti per aiutare a stabilire relazioni più dinamiche e modificabili tra gli oggetti in un’applicazione. Il formato di base per la composizione sull’ereditarietà è l’inclusione di un’istanza di un oggetto all’interno di un altro oggetto. Questo è nettamente diverso dal metodo di ereditarietà orientato agli oggetti, ma può servire allo stesso scopo in molti modelli. I vantaggi della composizione rispetto all’ereditarietà includono confini ben definiti tra gli oggetti composti e gli oggetti wrapper, la possibilità di modificare l’implementazione di un oggetto senza influenzare un’intera gerarchia di ereditarietà e una struttura meno restrittiva per la progettazione iniziale del programma. Alcune delle complicazioni, tuttavia, potrebbero includere difficoltà nella serializzazione e strutture eccessivamente complesse in programmi grandi e consolidati.
Nella programmazione orientata agli oggetti, uno dei tratti che è importante stabilire durante la progettazione è il modo in cui i diversi oggetti si relazionano tra loro. L’ereditarietà è un meccanismo centrale nella programmazione orientata agli oggetti e consente a un oggetto di ereditare tutti i dati e i metodi del suo genitore, che può quindi aggiungere, modificare o estendere con la propria implementazione. Un esempio di progettazione basata sull’ereditarietà potrebbe essere un programma che ha una classe principale che definisce un’auto e modella alcuni attributi generici di tutte le auto. La classe per ogni singola marca di auto viene quindi creata come discendente della classe principale ma definisce informazioni specifiche, come la cilindrata del motore, la capacità del carburante o altre informazioni specifiche per quella particolare marca di auto.
La composizione viene espressa includendo istanze di oggetti all’interno di altri oggetti. Se esiste una classe principale che definisce un’auto generica, invece di creare sottoclassi per marche di auto specifiche, la classe principale potrebbe invece contenere istanze di altri oggetti che definiscono l’auto in modo più specifico. Ciò potrebbe significare che la classe principale dell’auto potrebbe contenere un oggetto per il tipo di motore e uno per la capacità di carburante, che verrebbe impostato quando la classe viene utilizzata per creare un’istanza di una marca specifica di auto.
Con la composizione sull’ereditarietà, gli oggetti contenuti nella classe principale non sono direttamente correlati alla classe principale, offrendo agli sviluppatori la libertà di modificare il funzionamento dei singoli oggetti. Un problema che la composizione sull’ereditarietà può aiutare a prevenire è una situazione in cui un albero di ereditarietà può essere eccessivamente profondo, il che significa che qualsiasi modifica a una classe nell’albero potrebbe richiedere modifiche lungo la lunghezza dell’albero. Non tutti i linguaggi orientati agli oggetti supportano le eredità multiple e la composizione sull’ereditarietà è un metodo che può essere utilizzato per aggirare questa restrizione.