множественное наследование в Eiffel - PullRequest
1 голос
/ 16 января 2011

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

Спасибо

Ответы [ 2 ]

2 голосов
/ 02 февраля 2011

Не просто выбирать случайным образом. Вот рассмотренное использование выбора, которое может быть тем, что вы хотите. (Я буду голосовать за другой ответ, так как он правильный, за исключением того, что я не помогу с выбором.)

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
2 голосов
/ 17 января 2011

Класс French_Driver переименовывает только функцию violation, она не добавляет никакой новой.Таким образом, мы можем вызвать только French_violation для него, а не violation (такого имени больше нет в этом классе из-за переименования).То же самое верно для класса Us_Driver.

. В результате класс French_Us_Driver наследует элемент French_violation от French_Driver и элемент Us_violation от Us_Driver, поэтому существует двавсего функций: French_violation и Us_violation.

История остановилась бы здесь, если бы не было общего предка, откуда происходит элемент violation.Поскольку класс French_Us_Driver теперь имеет 2 версии функции violation, унаследованной от класса Driver (одна версия называется French_violation, а другая - Us_violation), неясно, какую из них следует использовать привызов функции violation в классе Driver, когда тип объекта French_Us_Driver.Конфликт должен быть разрешен добавлением предложения select к одному из родительских предложений, например:

class French_Us_Driver inherit
   French_Driver
      select French_violation end
   Us_Driver
end

Затем, когда объект violation вызывается из класса Driver объектатипа French_Us_Driver, функция French_violation будет фактически вызвана.

Наконец, можно объединить две версии функции в одну, присвоив им одно и то же имя, которое необязательно совпадает с именемorigin (в приведенном ниже коде пропущены другие детали переопределения функций и для простоты предполагается, что все функции отложены):

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
...