Perché usare l’ereditarietà?

So che la domanda è stata discussa in precedenza , ma sembra sempre presupposto che l’ereditarietà sia almeno a volte preferibile alla composizione. Mi piacerebbe contestare questa ipotesi nella speranza di acquisire una certa comprensione.

La mia domanda è questa: dal momento che è ansible realizzare qualsiasi cosa con la composizione dell’object che è ansible con l’ereditarietà classica e poiché l’ereditarietà classica è molto spesso abusata [1] e poiché la composizione dell’object ti dà la flessibilità per cambiare il runtime dell’object delegato, perché utilizzeresti mai? eredità classica?

Posso capire perché si consiglia l’ereditarietà in alcuni linguaggi come Java e C ++ che non offrono una comoda syntax per la delega. In queste lingue è ansible risparmiare un sacco di digitazione utilizzando l’ereditarietà ogni volta che non è chiaramente scorretto. Ma altri linguaggi come Objective C e Ruby offrono sia l’ereditarietà classica che la syntax molto comoda per la delega. Il linguaggio di programmazione Go è l’unica lingua che, a mia conoscenza, ha deciso che l’ereditarietà classica è più problematica di quanto valga e supporta solo la delega per il riutilizzo del codice.

Un altro modo per esprimere la mia domanda è questo: anche se si sa che l’ereditarietà classica non è scorretta per implementare un determinato modello, è sufficiente questa ragione per usarla al posto della composizione?

[1] Molte persone usano l’ereditarietà classica per ottenere il polimorfismo invece di lasciare che le loro classi implementino un’interfaccia. Lo scopo dell’ereditarietà è il riutilizzo del codice, non il polimorfismo. Inoltre, alcune persone usano l’ereditarietà per modellare la loro comprensione intuitiva di una relazione “è-a” che può spesso essere problematica .

Aggiornare

Voglio solo chiarire cosa intendo esattamente quando parlo di ereditarietà:

Sto parlando del tipo di ereditarietà con cui una class eredita da una class base parzialmente o completamente implementata . Non sto parlando di ereditare da una class base puramente astratta che equivale a implementare un’interfaccia, che io per la cronaca non sto discutendo.

Aggiornamento 2

Comprendo che l’ereditarietà è l’unico modo per ottenere il polimorfismo i C ++. In quel caso è ovvio perché devi usarlo. Quindi la mia domanda è limitata a linguaggi come Java o Ruby che offrono diversi modi per ottenere il polimorfismo (interfacce e digitazione anatra, rispettivamente).