[英]Replication from multiple inheritance in Eiffel
我在努力理解多重繼承與復制和多態性之間的相互作用。 請考慮以下構成經典菱形圖案的類。
deferred class A
feature
a deferred end
end
deferred class B
inherit A
rename a as b end
end
deferred class C
inherit A
rename a as c end
end
class D
inherit
B
C
select c end
feature
b do print("b") end
c do print("c") end
end
如果我將D的實例附加到類型為C的對象ob_as_c
,則ob_as_c.c
將按預期方式打印“ c”。 但是,如果將實例附加到類型B的對象ob_as_b
,則ob_as_b.b
將同時打印“ c”。
這是預期的行為嗎? 顯然,我希望ob_as_b.b
打印“ b”。
僅描述EiffelStudio中的實際行為,可能與實際的ECMA規范有所不同。
正在發生的事情是,如果沒有選擇 B和C對應於一個版本的 。 編譯器會抱怨您有兩個名稱不同但版本相同的例程。 通過使用“選擇”,您可以修復錯誤,並告訴編譯器對於動態綁定,要使用的版本為c ,而與目標的類型無關,它基於運行時目標的類型。
(化妝品:拼寫為“ deferred”。否則將無法編譯!)
“選擇”僅影響目標為使用重復祖先類型(此處為A)聲明的實體的呼叫的語義,因為在這種情況下,我們需要消除歧義。 對於類型B,C或D的實體沒有歧義,因此多態性和動態綁定的常規規則適用:對於同一目標對象,是否聲明類型B的實體(程序中的名稱)都沒關系或C。
-伯特蘭·邁耶(Bertrand Meyer)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.