переменная не установлена ​​должным образом после переименования в наследника

Я знаю, как это исправить (см. Мое решение @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, поэтому один из вызовов можно безопасно удалить.

Резюме: унаследованный код имеет дело только с выбранными версиями реплицированных функций.

Следствие: невыбранные версии реплицированных атрибутов должны быть явно инициализированы в классе, в котором они реплицируются.

Другие вопросы по тегам