Anche se potrebbe essere una cattiva pratica, direi che c'è tempo per raggiungere il suo scopo.
Anche se potrebbe essere una cattiva pratica, direi che c'è tempo per raggiungere il suo scopo.
Risposte:
/programming/995255/why-is-multiple-inheritance-not-allowed-in-java-or-c copre bene questa domanda.
La mia opinione è questa: i progettisti probabilmente volevano creare un linguaggio che promuovesse buoni principi di progettazione. Ok, quindi ci sono volte in cui l'ereditarietà multipla è perfetta. Quelle sono l'eccezione, piuttosto che la regola, e possono essere facilmente abusate. Quindi, i progettisti hanno deciso di renderlo impossibile da fare.
Per quei casi in cui andrebbe bene, è necessario utilizzare le interfacce. Funzionano, anche se goffamente; ma non ne avrai bisogno così tanto.
Giusto per illustrare perché no, l'ereditarietà multipla è supportata da C ++, ma è fortemente scoraggiata in quanto è possibile eseguire la maggior parte delle cose con una composizione che si farebbe con MI, ma in modo molto più pulito. A differenza di C ++, C # non è un linguaggio OOP di tipo "ibrido", ovvero non si è evoluto da una lingua precedente.
Se hai davvero bisogno di ereditarietà multipla, puoi implementare più interfacce.
Walter Bright è sia il creatore di D, che non include MI, sia l'unica persona a scrivere un intero compilatore C ++ da solo. Secondo lui, la ragione per cui D manca di MI è che è troppo difficile creare un sistema di MI che sia contemporaneamente efficiente, semplice e utile. Sospetto che Java e C # utilizzino un ragionamento simile. Lingue come Perl e Python non hanno l'efficienza come obiettivo primario, quindi hanno un sistema semplice e utile, ma difficile da implementare in modo efficiente. Il C ++ non sembra avere come obiettivo la semplicità, quindi ha creato un sistema enormemente complicato che quasi nessuno capisce.
Penso che Walter abbia ragione. Se esiste una lingua che ha un sistema MI che soddisfa ragionevolmente tutti e tre questi criteri, si prega di lasciare un commento.
L'ereditarietà multipla, se la usi molto, si traduce in situazioni molto complesse. Troppa complessità con pochi benefici è il motivo per cui è stato escluso sia per Java che per C #.
Perché i progettisti del linguaggio apparentemente volevano produrre un C ++ migliore, non un linguaggio migliore in generale. (Quanto successo hanno potuto essere discussi.)
L'ereditarietà multipla in stile C ++ ha alcuni problemi, e quindi le persone che derivano dal C ++ generalmente la omettono (Java, C #, D). Altre lingue, Eiffel e Common Lisp per nominarne due, lo fanno diversamente e non sembrano avere gli stessi problemi.