Класс 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