簡單地說:是由於該語言的設計者決定不使用。java
基本上,.NET和Java的設計者不使用多繼承(MI),是由於他們認爲給語言加上多繼承得到的好處較少,抵不上所以增長的複雜性。express
一、不一樣的語言對於多繼承如何工做實際上有不一樣的指望。好比說,在衝突時基類如何合併或處理冗餘。在CLR中實現多繼承以前,咱們須要查看一下全部其餘的語言,看看一些共通的概念,並在一種語言-中立的方式來表示它們。咱們還須要決定多繼承是否應存在 於CLS,而這對於不想要這個概念的語言(好比說可能有VB.NET)。固然,這本是公共語言運行時的份內之事,然而咱們沒有找到足夠的時間爲此來作。app
二、多繼承真正合適的地方實際上不多。在不少狀況下,多接口實現均可以作這個事。在其餘狀況下,你可使用封裝和委託。假如咱們添加一個稍微不一樣的構造器,如mixins,會更強大嗎?ide
三、多繼承給實現增長了不少的複雜性。這個複雜性影響了類型轉換,佈局,字段訪問,序列化,身份比較,可驗證,反射,泛型以及可能還有不少別的地方。佈局
原文:ui
The short answer is: because the language designers decided not to.this
Basically, it seemed that both the .NET and Java designers did not allow multiple inheritance because they reasoned that adding MI added too much complexity to the languages while providing too little benefit.spa
Different languages actually have different expectations for how MI works. For example, how conflicts are resolved and whether duplicate bases are merged or redundant. Before we can implement MI in the CLR, we have to do a survey of all the languages, figure out the common concepts, and decide how to express them in a language-neutral manner. We would also have to decide whether MI belongs in the CLS and what this would mean for languages that don't want this concept (presumably VB.NET, for example). Of course, that's the business we are in as a common language runtime, but we haven't got around to doing it for MI yet.設計
The number of places where MI is truly appropriate is actually quite small. In many cases, multiple interface inheritance can get the job done instead. In other cases, you may be able to use encapsulation and delegation. If we were to add a slightly different construct, like mixins, would that actually be more powerful?繼承
Multiple implementation inheritance injects a lot of complexity into the implementation. This complexity impacts casting, layout, dispatch, field access, serialization, identity comparisons, verifiability, reflection, generics, and probably lots of other places.
引自:http://stackoverflow.com/questions/995255/why-is-multiple-inheritance-not-allowed-in-java-or-c