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
谢谢
发布于 2011-01-18 00:29:04
类French_Driver仅重命名一个特征violation,它不会添加任何新的特征。因此,我们只能对它调用French_violation,而不能调用violation (由于重命名,该类中不再有这样的名称)。类Us_Driver也是如此。
因此,类French_Us_Driver从French_Driver继承了一个特性French_violation,从Us_Driver继承了一个特性Us_violation,因此总共有两个特性:French_violation和Us_violation。
如果功能violation的起源没有共同的祖先,那么故事就到此为止。因为French_Us_Driver类现在有从Driver类继承的特性violation的两个版本(一个版本名为French_violation,另一个版本名为Us_violation),所以当对象的类型为violation时,在Driver类中调用特性French_Us_Driver时,不清楚应该使用哪个版本。应通过向其中一个父子句添加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发布于 2011-02-03 00:26:23
不要只是随意选择。下面是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 --classhttps://stackoverflow.com/questions/4705611
复制相似问题