Composizione ed eredità.C'è qualcosa che la composizione non può realizzare che l'eredità può?
Sono consapevole che sono entrambi strumenti da scegliere quando appropriato e il contesto è molto importante nella scelta tra composizione ed eredità. Tuttavia, la discussione sul contesto appropriato per ciascuno di solito è un po 'confusa; questo mi ha fatto cominciare a considerare quanto distintamente l'ereditarietà e il polimorfismo siano aspetti separati dell'OOP tradizionale.
Il polimorfismo consente di specificare le relazioni "è-a" in modo uguale e l'ereditarietà. In particolare, l'ereditarietà da una classe di base crea implicitamente una relazione polimorfica tra quella classe e le sue sottoclassi. Tuttavia, mentre il polimorfismo può essere implementato utilizzando interfacce pure, l'ereditarietà complica la relazione polimorfica trasferendo simultaneamente i dettagli di implementazione. In questo modo, l'ereditarietà è ben diversa dal puro polimorfismo.
Come strumento, eredità serve programmatori diverso rispetto polimorfismo (attraverso interfacce puri) semplificando attuazione riutilizzo in casi banali. Nella maggior parte dei casi, tuttavia, i dettagli di implementazione di una superclasse sono in conflitto con i requisiti di una sottoclasse. Questo è il motivo per cui abbiamo "overrides" e "member hiding". In questi casi, il riutilizzo dell'implementazione offerto dall'ereditarietà viene acquistato con l'ulteriore sforzo di verificare le modifiche dello stato e i percorsi di esecuzione tra i livelli a cascata del codice: i dettagli di implementazione "appiattiti" completi della sottoclasse sono distribuiti tra più classi, il che di solito significa più file, di cui si applicano solo le parti alla sottoclasse in questione. Guardare attraverso quella gerarchia è assolutamente necessario quando si ha a che fare con l'ereditarietà, perché senza guardare il codice della superclasse, non c'è modo di sapere quali dettagli non nascosti stanno monkeying con il tuo stato o deviando l'esecuzione.
In confronto, l'uso esclusivo della composizione garantisce che vedrete quale stato può essere modificato da oggetti esplicitamente istanziati i cui metodi sono invocati a vostra discrezione. L'implementazione appiattita non è ancora stata raggiunta (e in realtà non è nemmeno auspicabile, dal momento che il vantaggio della programmazione strutturata è l'incapsulamento e l'astrazione dei dettagli di implementazione) ma si ottiene comunque il riutilizzo del codice, e si dovrà solo guardare in un posto quando il codice si comporta male.
Con l'obiettivo di testare queste idee in pratica, evitando l'eredità tradizionale per una combinazione di pura polimorfismo dell'interfaccia-based e composizione di oggetti, mi chiedo,
v'è la composizione oggetto nulla e interfacce non possono realizzare questo ereditarietà può ?
Modifica
Nelle risposte finora, ewernli crede non ci sono prodezze tecniche disponibili per una tecnica, ma non l'altro; più avanti menziona come differenti modelli e approcci progettuali sono inerenti a ciascuna tecnica. Questo è ragionevole. Tuttavia, il suggerimento mi porta a perfezionare la mia domanda chiedendo se l'uso esclusivo della composizione e delle interfacce al posto dell'eredità tradizionale proibirebbe l'uso di modelli di progettazione importanti? E se sì, non ci sono modelli equivalenti da usare nella mia situazione?
Personalmente, mi piacciono i mixin. :) –
Non ho il tempo di verificare la duplicazione effettiva, ma questo tema di eredità v. Composizione è perennemente visitato su SO, ad es. http://stackoverflow.com/questions/216523/object-oriented-best-practices-inheritance-v-composition-v-interfaces o http://stackoverflow.com/questions/1598722/should-i-use-inheritance -o-composizione. "Si può sempre dare una svolta a questo tema e chiamarlo romanzo sulle cose ..." Tuttavia, una cosa che dovremmo accettare è che questo tipo di domanda non porta a risposte definitive o addirittura autorevoli. Forse un CW potrebbe essere il formato più appropriato ... – mjv
Non intendevo riproporre un dibattito stanco. Certo, il modo in cui ho affermato che il mio caso era praticamente un campione unilaterale del suddetto dibattito, ma il mio interesse principale è nel rispondere se esiste o meno un uso per l'ereditarietà che non può essere realmente sostituito con la composizione e le interfacce. p.s., che cos'è un formato CW? Forse proverò che ... –