2015-09-10 4 views
0

Я изо всех сил пытаюсь понять взаимодействие множественного наследования с репликацией и полиморфизмом. Пожалуйста, рассмотрите следующие классы, образующие классический образец алмаза.Репликация из множественного наследования в Eiffel

deferred class A 
    feature 
    a deferred end 
    end 

deferred class B 
    inherit A 
    rename a as b end 
    end 

deferred class C 
    inherit A 
    rename a as c end 
end 

class D 
    inherit 
    B 
    C 
    select c end 
feature 
    b do print("b") end 
    c do print("c") end 
end 

Если я прикрепить экземпляр D к объекту ob_as_c типа С, затем ob_as_c.c печатает «C», как и ожидалось. Однако, если прикрепить экземпляр к объекту ob_as_b типа B, то ob_as_b.b напечатает также печать «c».

Это намеренное поведение? Очевидно, я хотел бы ob_as_b.b напечатать «b».

ответ

1

Просто описать фактическое поведение в EiffelStudio, которое может отличаться от фактической спецификации ECMA.

То, что происходит в том, что без выбрать как б и гр соответствует версии . Компилятор будет жаловаться, что у вас есть 2 подпрограммы с другим именем, но с той же версией. Используя `select ', вы исправляете ошибку и сообщаете компилятору, что для динамической привязки используемая версия равна c, и это независимо от типа цели, оно основано на типе цели во время выполнения.

+0

Благодарим за объяснение. К сожалению, это делает характеристики наследования Эйфеля гораздо менее полезными для меня. – beckni

+1

Что касается спецификации ECMA: не указано 8.16.11, «Определение: версия динамической привязки», укажите, что в моем примере 'ob_as_b.b' должен печатать« b », поскольку существует только конформный путь от D до B и функция b of D является унаследованной функцией b из B? Предложение select должно быть релевантным только при наличии двух или более путей соответствия. – beckni

0

(косметика: правописание «отложено» В противном случае он не будет компилироваться.!)

«выбрать» влияет только на семантику вызова, чья цель является юридическим лицом, объявленным с повторяющимся типом предка, здесь , так как в этом случае нам нужна неоднозначность. Для объектов типа B, C или D нет двусмысленности, поэтому применяются обычные правила полиморфизма и динамического связывания: для одного и того же целевого объекта не имеет значения, объявлен ли объект (имя в программе) типа B или C.

- Bertrand Meyer

+0

То, что вы описываете, - это поведение, которое я ожидал, и это, я думаю, указано в 8.16.11 в стандарте ECMA. Однако это не то, что происходит в EiffelStudio: в моем примере результат 'ob_as_b.b' зависит от предложения select в D, хотя B не является повторным предком D. (Btw, я исправил смущающую опечатку.) – beckni

 Смежные вопросы

  • Нет связанных вопросов^_^