I have read in several places that having one programming language mechanism that conflates both is a bad thing. [...] So why is this a bad thing?
Perché in situazioni in cui uno vuole uno di loro e non l'altro, uno è lasciato senza un'opzione (una rifusione del "voleva una banana, ma quello che hai ottenuto era un gorilla che tiene il problema della banana e dell'intera giungla", importare una citazione famosa ). "sottoclasse" come presentato in molte lingue è un'operazione che "significa molto", che ha "troppe operazioni" all'interno, con un requisito "tutto o niente".
Esempio 1 : Supponiamo che un tipo A
sia introdotto da una dichiarazione di una classe "grassa" A
- una classe le cui istanze richiedono una grande quantità di memoria.
Ora supponiamo che in questo sistema sia richiesto un nuovo sottotipo di A
(chiamalo B
), che "estende" A
con operazioni extra utilizzate in una nuova area del sistema, ma i cui valori dovrebbero essere anche utilizzato in aree vecchie (dove sono previsti valori di tipo A
). Il requisito finale per B
è che anche se i valori di questo tipo si conformano rigorosamente al "contratto" di A
, questi valori non hanno bisogno di - o anche non devono - occupare molta memoria.
In una lingua in cui entrambe le operazioni sono confuse in un'operazione "sottoclasse", non c'è alcuna opzione: avere un sottotipo di A
utilizzato dove A
è previsto, uno deve sottoclasse A
e sottoclasse A
, uno porta alla sottoclasse un gruppo di cose che non sono solo irrilevanti per la sottoclasse, ma esplicitamente indesiderate. Volevi solo il tipo, ma hai anche la struttura.
Esempio n. 2 : c'è anche il contrario. Cioè, una classe A
esiste in un sistema, e si vuole creare una nuova struttura B
basata su A
ma la cui semantica, per qualche motivo, partirà dal "contratto" di A
in alcuni modo ragionevole A causa di tale violazione, per motivi di sicurezza (o anche di semantica) ci si aspetta che i valori di tipo B
non debbano essere usati dove sono previsti valori di tipo A
(e viceversa). Di nuovo, con solo un'operazione generica di "sottoclasse", questa opzione non è disponibile. Vuoi solo la struttura, ma otterrai anche il tipo.
Mentre questo è comunemente usato attorno a un valore incapsulato di tipo A
in B
(altrimenti noto come "composizione"), uno è costretto a scrivere tutto il codice di colla artificiale che altrimenti non sarebbe necessario.