从 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 规范不同。

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

(Cosmetics:拼写为"deferred"。否则编译不通过!)

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

-- 伯特兰迈耶