[英]multiple inheritance in Eiffel
Hoi,eiffel中的多重继承让我很困惑,任何人都可以告诉我French_Us_Driver
从其所有父级继承的是什么类。
class Driver
feature(ANY)
violation
end
end --end Driver
class French_Driver
inherite
Driver
rename
violation as French_violatin
end
end -- end French_Driver
class US_Driver
inherit
Driver
rename
violation as Us_violation
end
end --end Us_Driver
class French_Us__Driver
inherit
French_Driver
Us_Driver
end
end --French_Us_Driver
现在有French_Us_Driver
功能: Us_violation
, French_violation
和violation
或者: Us_violation
, French_violation
谢谢
French_Driver
类只重命名一个功能violation
,它不会添加任何新功能。 因此,我们只能调用French_violation
而不是violation
(由于重命名,此类中不再存在此类名称)。 Us_Driver
课程也是如此。
其结果是类French_Us_Driver
继承的功能French_violation
从French_Driver
和功能Us_violation
从Us_Driver
,所以有两个特点总数: French_violation
和Us_violation
。
如果没有共同特征violation
来源的共同祖先,故事就会停在这里。 因为类French_Us_Driver
现在有2个版本的功能violation
继承自类Driver
(一个版本名为French_violation
而另一个版本名为Us_violation
),所以当在类Driver
调用功能violation
时,不清楚应该使用哪个版本对象的类型是French_Us_Driver
。 应该通过向其中一个parent子句添加select
子句来解决冲突,例如:
class French_Us_Driver inherit
French_Driver
select French_violation end
Us_Driver
end
然后,当在类型为French_Us_Driver
的对象上从类Driver
调用功能violation
时,实际上将调用功能French_violation
。
最后,可以将两个版本的功能合并为一个,为它们提供相同的名称,这些名称不必与原始名称相匹配(下面的代码省略了功能重新声明的其他细节,并且为了简单起见假设所有功能都延迟):
class French_Us_Driver inherit
French_Driver
rename French_violation as French_Us_violation end
Us_Driver
rename Us_violation as French_Us_violation end
end
不要随意选择。 这是一个考虑使用select可能是你想要的。 (我会在正确的情况下投票给另一个答案,除非没有提供有关如何使用select的帮助。)
class
French_Us_Driver
inherit
Driver
select
violation
end
French_Driver end
Us_Driver end
feature
violation
inspect country
when france then French_violation
when usa then Us_violation
end --inspect
end --violation
end --class
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.