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

如果我将 D 的实例附加到ob_as_cC 类型的对象,ob_as_c.c则按预期打印“c”。但是,如果将实例附加到ob_as_b类型 B 的对象上,则ob_as_b.b打印也会打印“c”。

这是预期的行为吗?显然,我想ob_as_b.b打印“b”。

4

2 回答 2

1

仅描述 EiffelStudio 中可能与实际 ECMA 规范不同的实际行为。

发生的事情是,如果没有选择bc都对应于 a 的版本。编译器会抱怨您有 2 个名称不同但版本相同的例程。通过使用“选择”,您正在修复错误并告诉编译器对于动态绑定,要使用的版本是c,这与目标的类型无关,它基于运行时目标的类型。

于 2015-09-10T22:03:03.917 回答
0

(化妆品:拼写是“延迟”。否则它不会编译!)

“select”只影响调用的语义,其目标是使用重复祖先类型声明的实体,这里是 A,因为在这种情况下我们需要消歧。对于 B、C 或 D 类型的实体,没有歧义,因此适用多态性和动态绑定的常规规则:对于同一个目标对象,实体(程序中的名称)是否声明为 B 类型无关紧要或 C。

——伯特兰·迈耶

于 2015-09-24T16:57:27.557 回答