0

多重継承とレプリケーションおよびポリモーフィズムの相互作用を理解するのに苦労しています。古典的なダイヤモンド パターンを形成する次のクラスを検討してください。

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

ob_as_cD のインスタンスをC 型のオブジェクトにアタッチすると、ob_as_c.c期待どおり "c" が出力されます。ただし、インスタンスをob_as_bタイプ B のオブジェクトにアタッチすると、 ob_as_b.b"c" も出力されます。

これは意図した動作ですか?ob_as_b.b明らかに、 「b」を印刷したいと思います。

4

2 に答える 2

1

実際の ECMA 仕様とは異なる可能性がある EiffelStudio の実際の動作を説明するだけです。

何が起こっているかというと、selectがないとbcの両方が aのバージョンに対応するということです。コンパイラは、名前は異なるがバージョンが同じ 2 つのルーチンがあると不平を言います。「select」を使用することにより、エラーを修正し、動的バインディングに使用するバージョンはcであり、これはターゲットのタイプに関係なく、実行時のターゲットのタイプに基づいていることをコンパイラに伝えます。

于 2015-09-10T22:03:03.917 に答える