переменная не установлена должным образом после переименования в наследника
Я знаю, как это исправить (см. Мое решение @bottom), но не понимаю, почему возникает эта ошибка компиляции, так как, на мой взгляд, переименованные атрибуты должны быть созданы Предшественником в default_create. Почему это не так?
NRJ_ENTITY
inherit
ANY
redefine
default_create
end
feature {NONE} -- Initialization
default_create
do
create current_day
create current_month
create current_year
Precursor
end
feature -- Access
current_day,
current_month,
current_year: ENERGY_UNIT
end
NRJ_CONSUMER
inherit
NRJ_ENTITY
end
NRJ_GENERATOR
inherit
NRJ_ENTITY
end
NRJ_GENERATOR_CONSUMER
inherit
NRJ_GENERATOR
rename
current_day as current_day_generation,
current_month as current_month_generation,
current_year as current_year_generation
redefine
default_create
select
current_day_generation,
current_month_generation,
current_year_generation
end
NRJ_CONSUMER
rename
current_day as current_day_consumption,
current_month as current_month_consumption,
current_year as current_year_consumption
redefine
default_create
end
feature {NONE} -- Initialize
default_create
do
Precursor {NRJ_GENERATOR}
Precursor {NRJ_CONSUMER}
end
конец
Скриншот ошибки
Исправить в NRJ_GENERATOR_CONSUMER
default_create
do
create current_day_consumption
create current_month_consumption
create current_year_consumption
Precursor {NRJ_CONSUMER}
Precursor {NRJ_GENERATOR}
end
1 ответ
Класс NRJ_GENERATOR_CONSUMER
имеет две версии каждого атрибута из NRJ_ENTITY
. Например,current_day
есть версии current_day_generation
а также current_day_consumption
. Код вNRJ_ENTITY
работает только с одной версией current_day
, возможно переименован. Про вторую версию он не знает. Чтобы определить, какую версию реплицированного атрибута (или функции в целом) следует использовать, класс с репликацией долженselect
ровно одна подходящая версия.
В этом примере выбранная версия current_day_generation
. Следовательно,default_create
унаследовано от NRJ_ENTITY
инициализирует его, а не другой атрибут. Другими словами, при репликации
create current_day
не переводится автоматически на
create current_day_generation
create current_day_consumption
но просто в
create current_day_generation -- The selected version.
Это объясняет, почему вам нужно исправление, о котором вы говорите.
Также обратите внимание, что инструкция Precursor {NRJ_CONSUMER}
а также Precursor {NRJ_GENERATOR}
назвать точно такую же версию default_create
определено в NRJ_ENTITY
, поэтому один из вызовов можно безопасно удалить.
Резюме: унаследованный код имеет дело только с выбранными версиями реплицированных функций.
Следствие: невыбранные версии реплицированных атрибутов должны быть явно инициализированы в классе, в котором они реплицируются.