這可能聽起來很傻,但如果每一個類隱式擴展對象類,並允許其延長多一個班,怎麼就不是多重繼承?從用戶的角度來看,可能會認爲它們不支持多重繼承,因爲用戶不允許擴展多個類。然而,這些語言似乎對多重繼承有內部支持,而這些繼承只是不向用戶公開以保持簡單。我有道理嗎?多重繼承在Ruby,Java等
注:我不爭論或反對支持多繼承。只是想澄清一些想法。
這可能聽起來很傻,但如果每一個類隱式擴展對象類,並允許其延長多一個班,怎麼就不是多重繼承?從用戶的角度來看,可能會認爲它們不支持多重繼承,因爲用戶不允許擴展多個類。然而,這些語言似乎對多重繼承有內部支持,而這些繼承只是不向用戶公開以保持簡單。我有道理嗎?多重繼承在Ruby,Java等
注:我不爭論或反對支持多繼承。只是想澄清一些想法。
典型OO系統支持派生類的鏈(具有任意長度)。從任何一個子類的角度來看,父母形成一個鏈回到對象。一次查看所有的類,我們看到類層次結構實際上是一棵樹,在Object的下方有一個非常廣泛的扇出。
什麼是不典型的是允許在樹上兩個分支到已經直接多個超,以及專門的一類再合併是什麼「多重繼承」的意思。
無論是哪種方式,您都有可能在英語意義上是「多重」,但OO意義上的「多重」意味着最終能夠將單個對象傳遞給多個接口,每個接口都需要一個與其他方式無關的對象父類。
解決此限制的一種方法是也是典型的,這就是爲什麼你在Java接口和包括(「混入」)在Ruby中的模塊。
現在多數民衆贊成我如何開始思考:) – secreteyes
+1,說得好。一個小問題是:「它實際上是一棵樹」,這是一種奇怪的從階級模式轉變爲階級階層的過程,其中一個先行詞缺失並且不同於前一句的暗示。 –
+1。我們可以通過合成實現多重繼承的目標,這正是Java和Ruby所做的。我的問題更多的是關於這些語言是否支持多繼承,但不暴露給用戶。 David Nehme的評論幫助我找出了思維過程中的缺陷。 –
不同的是,「真實的」多重繼承允許你從不同的類樹差別類inherate。如果你的子類繼承的兩個類具有相似的屬性或方法,那麼你就必須處理孩子中的衝突。
像Java,在多重繼承是不允許的語言,相同的成員只需在子類中的成員覆蓋。
總之,儘管在類型層次結構中可以有很多類,但每個成員只有一個版本,因爲每個孩子都會用自己的父代成員覆蓋父成員。在Java中
一切引用類型爲java.lang.Object
,因爲你已經注意到。
定義自定義類型的開發人員可以使用一種實現進行擴展。你可以選擇實現多個接口,但是這些接口沒有任何實現。開發人員必須添加他們自己的。
因此,當您說Java中的自定義類型接收來自java.lang.Object
和擴展超類的實現時,您可能會嚴格正確,但它被認爲是實現的單一繼承,因爲開發人員只能擴展一個實現類。
你在爭論語義。您在不能在Java中擴展多個實現。
但你可以實現多個接口。
你描述的情況只是純粹的繼承,它與多重繼承沒有任何共同之處。例如在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]
我喜歡你的答案,清楚的例子和+1。但是,我不確定您是否正確「您描述的情況只是純粹的繼承,與多重繼承沒有任何共同之處。」在Java和Ruby中,祖先的每一層只能是一個類,這是正常的繼承。我一直認爲並仍然認爲多重繼承意味着同時繼承多個類的能力。我們中的一個可能會對這裏的術語感到困惑,我會讓其他人權衡這一點。我在David Nehme的評論中找到了我原來的問題的答案。 –
@Srini K,使用mixins在某種程度上就像「同時使用多個類」。在ruby中,與Java不同,最基本的構建塊實際上是Module,而不是Class(類繼承Module)。當你使用mixin時,雖然效果可能會像「多重繼承」一樣,但ruby實際上只是按照模塊包含的順序將每個模塊插入到繼承鏈中。 – d11wtq
一類沒有按除了Object之外,還會擴展「更多類」。如果您未指定父級,則默認父級爲「對象」。 –
你的評論是正確的,我覺得現在真的很愚蠢。但這不會是第一次或最後一次。所以每個類都不會隱式擴展對象,而是隻在沒有指定父對象的情況下進行擴展。但是每個類都可以訪問Object的屬性,因爲這種或那種方式的層次結構包括Object作爲根。所以這些語言沒有多重繼承的內部或外部支持。說得通。謝謝。 –