1

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_violationおよびviolation

または : Us_violation,French_violation

ありがとう

4

2 に答える 2

2

クラスは機能のFrench_Driver名前を変更するだけでviolation、新しい機能を追加しません。そのため、呼び出すことはできますが、呼び出すことはできFrench_violationませんviolation(名前が変更されたため、このクラスにはそのような名前はもうありません)。同じことがクラスにも当てはまりますUs_Driver

その結果、クラスはから機能をFrench_Us_Driver継承し、French_violationからFrench_Driver機能を継承するため、合計で と の 2 つの機能があります。Us_violationUs_DriverFrench_violationUs_violation

violation機能の起源となる共通の祖先が存在しない場合、話はここで終わります。クラスには、クラスから継承されFrench_Us_Driverた機能の 2つのバージョン (1 つのバージョンの名前は、もう 1 つは - )があるため、オブジェクトの型が の場合にクラス内の機能を呼び出すときにどちらを使用する必要があるかが明確ではありません。競合は、親句の 1 つに句を追加して解決する必要があります。次に例を示します。violationDriverFrench_violationUs_violationviolationDriverFrench_Us_Driverselect

class French_Us_Driver inherit
   French_Driver
      select French_violation end
   Us_Driver
end

次に、type のオブジェクトのviolationクラスから機能が呼び出されると、その機能が実際に呼び出されます。DriverFrench_Us_DriverFrench_violation

最後に、オリジンの名前と一致する必要のない同じ名前を付けることで、機能の 2 つのバージョンを 1 つにマージすることができます (以下のコードでは、機能の再宣言の他の詳細を省略し、簡単にするためにすべての機能が延期されていると想定しています)。 ):

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 に答える
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
于 2011-02-02T16:26:22.707 に答える