从 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 b 和 c对应于a的一个版本。编译器会抱怨您有 2 个名称不同但版本相同的例程。通过使用“select”,您正在修复错误并告诉编译器动态绑定要使用的版本是 c,这与目标的类型无关,它基于运行时目标的类型。
(Cosmetics:拼写为"deferred"。否则编译不通过!)
"select" 只影响调用的语义,其目标是用重复祖先类型声明的实体,这里是 A,因为在这种情况下我们需要消除歧义。对于类型 B、C 或 D 的实体没有歧义,因此适用多态性和动态绑定的正常规则:对于相同的目标对象,实体(程序中的名称)是否声明为类型 B 无关紧要或 C.
-- 伯特兰迈耶
我正在努力理解多重继承与复制和多态性之间的相互作用。请考虑以下 类 形成经典菱形图案。
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 b 和 c对应于a的一个版本。编译器会抱怨您有 2 个名称不同但版本相同的例程。通过使用“select”,您正在修复错误并告诉编译器动态绑定要使用的版本是 c,这与目标的类型无关,它基于运行时目标的类型。
(Cosmetics:拼写为"deferred"。否则编译不通过!)
"select" 只影响调用的语义,其目标是用重复祖先类型声明的实体,这里是 A,因为在这种情况下我们需要消除歧义。对于类型 B、C 或 D 的实体没有歧义,因此适用多态性和动态绑定的正常规则:对于相同的目标对象,实体(程序中的名称)是否声明为类型 B 无关紧要或 C.
-- 伯特兰迈耶