1

Hoi,埃菲尔的多重继承真的让我很困惑,谁能告诉我哪个类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

谢谢

4

2 回答 2

2

不要只是随机选择。这是一个经过深思熟虑的 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
于 2011-02-02T16:26:22.707 回答
2

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

结果,该类French_Us_Driver继承了一个特征French_violationFrench_Driver一个特征Us_violationUs_Driver所以总共有两个特征:French_violationUs_violation

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

class French_Us_Driver inherit
   French_Driver
      select French_violation end
   Us_Driver
end

然后,当从类型对象的violation类中调用一个特性时,该特性实际上会被调用。DriverFrench_Us_DriverFrench_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-01-17T16:29:04.477 回答