繁体   English   中英

埃菲尔的多重继承

[英]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_violationFrench_violationviolation

或者: Us_violationFrench_violation

谢谢

French_Driver类只重命名一个功能violation ,它不会添加任何新功能。 因此,我们只能调用French_violation而不是violation (由于重命名,此类中不再存在此类名称)。 Us_Driver课程也是如此。

其结果是类French_Us_Driver继承的功能French_violationFrench_Driver和功能Us_violationUs_Driver ,所以有两个特点总数: French_violationUs_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM