Por que o C # não suporta herança múltipla?

10

Mesmo que possam ser más práticas, eu diria que há tempo para cumprir seu objetivo.

Amir Rezaei
fonte
11
Eu simplesmente amo como todo mundo dá todas essas desculpas pela ausência de um recurso totalmente útil em qualquer produto que a Microsoft produz (os MVPs são especialmente hábeis nisso). Meu palpite é que a maioria das pessoas que não entendem os benefícios da herança múltipla são as que não entendem (e não usam) a herança em primeiro lugar, porque preferem o sempre popular copiar e copiar cole o código 20 vezes que eu vejo em quase todos os projetos em todos os lugares. Sem dúvida, se e quando a Microsoft decide implementar MI, todo mundo vai tornar-se subitamente um entusiasta enrugado, não esperar uma "evangelista", afirmando
11
@DaveZiffer provavelmente, mas parece difícil acertar. Você conhece um idioma ou implementação em que ele funciona muito bem?
4
@ Dave Ou você apenas superestima sua utilidade. A herança em geral é superestimada e os casos ausentes podem ser facilmente modelados usando interfaces e composição. A herança múltipla é realmente inútil em C #. A única vantagem é que evita a necessidade de delegar manualmente os métodos de interface para a implementação nos membros compostos. Isso poderia ter sido resolvido melhor (por exemplo, com a introdução de mixins), mas não é uma boa razão para introduzir herança múltipla.
Konrad Rudolph
Estou codificando OO em java há muitos anos, fazendo uso razoável da herança (às vezes, menos quando aprendi melhor) e encontrei exatamente 1 vez em que era realmente difícil contornar a herança múltipla e talvez 10 vezes onde eu poderia tê-lo usado para simplificar meu design atual - e exatamente zero vezes em que não pude redesigná-lo para não precisar de herança múltipla e ter o design geral melhor do que teria sido com ele.
Bill K

Respostas:

14

/programming/995255/why-is-multiple-inheritance-not-allowed-in-java-or-c aborda bem essa questão.

Minha opinião é a seguinte: os designers provavelmente queriam criar uma linguagem que promovesse bons princípios de design. Ok, há momentos em que a herança múltipla é perfeita. Essa é a exceção, e não a regra, e pode ser abusada com muita facilidade. Então, os designers decidiram tornar isso impossível.

Para os casos em que seria bom, você precisa usar interfaces. Esses trabalhos, embora desajeitadamente; mas você não precisará muito deles.

Michael K
fonte
8

Apenas para ilustrar por que não, a herança múltipla é suportada pelo C ++, mas é fortemente desencorajada, pois você pode realizar a maioria das coisas com a composição que faria com o MI, porém de uma maneira muito mais limpa. Diferentemente do C ++, o C # não é uma linguagem OOP do tipo "híbrido", ou seja, não evoluiu de uma linguagem anterior.

Se você realmente precisar de herança múltipla, poderá implementar várias interfaces.

Jas
fonte
6

Walter Bright é o criador do D, que não inclui o MI, e a única pessoa a escrever um compilador C ++ inteiro sozinho. Segundo ele, o motivo pelo qual D não tem MI é que é muito difícil criar um sistema de MI simultaneamente eficiente, simples e útil. Eu suspeito que Java e C # usam raciocínio semelhante. Idiomas como Perl e Python não têm eficiência como objetivo principal; portanto, eles têm um sistema simples e útil, mas difícil de implementar com eficiência. O C ++ não parece ter a simplicidade como objetivo, por isso criou um sistema extremamente complicado que quase ninguém entende.

Eu acho que Walter está bem no alvo. Se houver algum idioma que possua um sistema MI que atenda razoavelmente bem a todos esses três critérios, deixe um comentário.

dsimcha
fonte
2
O que você acha sobre Eiffel, Common Lisp e Dylan? Eu sei que os três são simples e úteis. E eu sei que o Common Lisp e o Dylan podem competir e até vencer o C ++ (e freqüentemente até o C) no desempenho, de modo que parece satisfazer a eficiência. Eu não sei que o Eiffel compilador é terrivelmente lento, mas eu sei quase nada sobre o desempenho do código compilado que produz.
Jörg W Mittag
-1

Como os designers de linguagem aparentemente queriam produzir um C ++ melhor, não um idioma melhor em geral. (O sucesso deles pode ser debatido.)

A herança múltipla no estilo C ++ tem alguns problemas e, portanto, as pessoas que derivam do C ++ geralmente a omitem (Java, C #, D). Outras línguas, Eiffel e Common Lisp, para citar duas, fazem de maneira diferente e não parecem ter os mesmos problemas.

David Thornley
fonte