2011-09-21 124 views
0

這可能聽起來很傻,但如果每一個類隱式擴展對象類,並允許其延長多一個班,怎麼就不是多重繼承?從用戶的角度來看,可能會認爲它們不支持多重繼承,因爲用戶不允許擴展多個類。然而,這些語言似乎對多重繼承有內部支持,而這些繼承只是不向用戶公開以保持簡單。我有道理嗎?多重繼承在Ruby,Java等

注:我不爭論或反對支持多繼承。只是想澄清一些想法。

+5

一類沒有按除了Object之外,還會擴展「更多類」。如果您未指定父級,則默認父級爲「對象」。 –

+1

你的評論是正確的,我覺得現在真的很愚蠢。但這不會是第一次或最後一次。所以每個類都不會隱式擴展對象,而是隻在沒有指定父對象的情況下進行擴展。但是每個類都可以訪問Object的屬性,因爲這種或那種方式的層次結構包括Object作爲根。所以這些語言沒有多重繼承的內部或外部支持。說得通。謝謝。 –

回答

7

典型OO系統支持派生類的(具有任意長度)。從任何一個子類的角度來看,父母形成一個鏈回到對象。一次查看所有的類,我們看到類層次結構實際上是一棵樹,在Object的下方有一個非常廣泛的扇出。

什麼是典型的是允許在樹上兩個分支到已經直接多個超,以及專門的一類再合併是什麼「多重繼承」的意思。

無論是哪種方式,您都有可能在英語意義上是「多重」,但OO意義上的「多重」意味着最終能夠將單個對象傳遞給多個接口,每個接口都需要一個與其他方式無關的對象父類。

解決此限制的一種方法是也是典型的,這就是爲什麼你在Java接口和包括(「混入」)在Ruby中的模塊。

+1

現在多數民衆贊成我如何開始思考:) – secreteyes

+1

+1,說得好。一個小問題是:「它實際上是一棵樹」,這是一種奇怪的從階級模式轉變爲階級階層的過程,其中一個先行詞缺失並且不同於前一句的暗示。 –

+0

+1。我們可以通過合成實現多重繼承的目標,這正是Java和Ruby所做的。我的問題更多的是關於這些語言是否支持多繼承,但不暴露給用戶。 David Nehme的評論幫助我找出了思維過程中的缺陷。 –

1

不同的是,「真實的」多重繼承允許你從不同的類樹差別類inherate。如果你的子類繼承的兩個類具有相似的屬性或方法,那麼你就必須處理孩子中的衝突。

像Java,在多重繼承是不允許的語言,相同的成員只需在子類中的成員覆蓋。

總之,儘管在類型層次結構中可以有很多類,但每個成員只有一個版本,因爲每個孩子都會用自己的父代成員覆蓋父成員。在Java中

0

一切引用類型爲java.lang.Object,因爲你已經注意到。

定義自定義類型的開發人員可以使用一種實現進行擴展。你可以選擇實現多個接口,但是這些接口沒有任何實現。開發人員必須添加他們自己的。

因此,當您說Java中的自定義類型接收來自java.lang.Object和擴展超類的實現時,您可能會嚴格正確,但它被認爲是實現的單一繼承,因爲開發人員只能擴展一個實現類。

你在爭論語義。您在不能在Java中擴展多個實現。

但你可以實現多個接口。

2

你描述的情況只是純粹的繼承,它與多重繼承沒有任何共同之處。例如在Java中,我們有從Number繼承的Integer,並且Number繼承自Object。多重繼承的語言

標準的例子是C++

class A { }; 
class B { }; 
class C { }; 
class X : public A, private B, public C { }; 

而在Java中,我們有

class A { } 
class B extends A { } 
class C extends B { } 
class X extends C { } 

在多重繼承的Ruby來講是類似於Java(紅寶石班只能有一個祖先)。然而Ruby提供不同的機制,「作爲」多重繼承即模塊

# class XX inherits from CC 
class AA 
end 
class BB < AA 
end 
class CC < BB 
end 
class XX < CC 
end 

# class X mixin A,B,C modules 
module A end 
module B end 
module C end 
class X 
    include A 
    include B 
    include C 
end 

在Ruby(類似於爪哇)類AA具有默認祖先(繼承鏈取決於紅寶石版本)

X.ancestors 
[X, C, B, A, Object, Kernel, BasicObject] 
XX.ancestors 
[XX, CC, BB, AA, Object, Kernel, BasicObject] 
+0

我喜歡你的答案,清楚的例子和+1。但是,我不確定您是否正確「您描述的情況只是純粹的繼承,與多重繼承沒有任何共同之處。」在Java和Ruby中,祖先的每一層只能是一個類,這是正常的繼承。我一直認爲並仍然認爲多重繼承意味着同時繼承多個類的能力。我們中的一個可能會對這裏的術語感到困惑,我會讓其他人權衡這一點。我在David Nehme的評論中找到了我原來的問題的答案。 –

+2

@Srini K,使用mixins在某種程度上就像「同時使用多個類」。在ruby中,與Java不同,最基本的構建塊實際上是Module,而不是Class(類繼承Module)。當你使用mixin時,雖然效果可能會像「多重繼承」一樣,但ruby實際上只是按照模塊包含的順序將每個模塊插入到繼承鏈中。 – d11wtq