【问题标题】:multiple inheritance in Eiffel埃菲尔的多重继承
【发布时间】:2011-01-16 13:31:49
【问题描述】:

嘿,埃菲尔的多重继承真的让我很困惑,谁能告诉我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_violation,French_violation

谢谢

【问题讨论】:

  • "inheritE" - 这绝对是违反法语的 :-)

标签: oop multiple-inheritance eiffel


【解决方案1】:

French_Driver 类只重命名了一个特性 violation,它没有添加任何新特性。所以,我们只能调用French_violation 而不能调用violation(由于重命名,这个类中不再有这样的名称)。 Us_Driver 类也是如此。

因此类French_Us_DriverFrench_Driver继承了一个特性French_violation,从Us_Driver继承了一个特性Us_violation,所以总共有两个特性:French_violationUs_violation

如果特征violation 的起源没有共同祖先,故事就到此为止。因为类French_Us_Driver现在有2个版本的特性violation继承自类Driver(一个版本被命名为French_violation,另一个被命名为Us_violation),不清楚什么时候应该使用哪个版本当对象的类型为French_Us_Driver 时,在Driver 类中调用功能violation。应该通过将select 子句添加到父子句之一来解决冲突,例如:

class French_Us_Driver inherit
   French_Driver
      select French_violation end
   Us_Driver
end

然后,当从 Driver 类对 French_Us_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

【讨论】:

    【解决方案2】:

    不要只是随机选择。这是一个经过深思熟虑的 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
    

    【讨论】:

      猜你喜欢
      • 2015-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-08
      • 2018-12-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多