簡體   English   中英

從Eiffel中的多重繼承復制

[英]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規范有所不同。

正在發生的事情是,如果沒有選擇 BC對應於一個版本 編譯器會抱怨您有兩個名稱不同但版本相同的例程。 通過使用“選擇”,您可以修復錯誤,並告訴編譯器對於動態綁定,要使用的版本為c ,而與目標的類型無關,它基於運行時目標的類型。

(化妝品:拼寫為“ deferred”。否則將無法編譯!)

“選擇”僅影響目標為使用重復祖先類型(此處為A)聲明的實體的呼叫的語義,因為在這種情況下,我們需要消除歧義。 對於類型B,C或D的實體沒有歧義,因此多態性和動態綁定的常規規則適用:對於同一目標對象,是否聲明類型B的實體(程序中的名稱)都沒關系或C。

-伯特蘭·邁耶(Bertrand Meyer)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM