重命名为继承人后变量未正确设置

variable is not properly set after renaming into heir

我知道如何修复它(参见我的解决方案@bottom)但不明白为什么会出现此编译错误,因为在我看来,重命名的属性应该由 Precursor 创建到 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_消费者

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

Class NRJ_GENERATOR_CONSUMER 有来自 NRJ_ENTITY 的每个属性的两个版本。例如,current_day 有版本 current_day_generationcurrent_day_consumptionNRJ_ENTITY 中的代码仅适用于 current_day 的一个版本,可能已重命名。它不知道第二个版本。为了告诉应该使用哪个版本的复制属性(或一般的功能),class 与复制应该 select 恰好是一个合适的版本。

本例中选择的版本为current_day_generation。因此,从 NRJ_ENTITY 继承的 default_create 初始化它而不是其他属性。换句话说,有了复制,

create current_day

不会自动翻译成

create current_day_generation
create current_day_consumption

但刚刚进入

create current_day_generation -- The selected version.

这解释了为什么您需要您所指的修复程序。

此外,请注意 Precursor {NRJ_CONSUMER}Precursor {NRJ_GENERATOR} 指令调用了 NRJ_ENTITY 中定义的完全相同版本的 default_create,因此可以安全地删除其中一个调用.

总结:继承代码只处理复制特征的选定版本。

推论: 复制属性的非选定版本必须在复制属性的 class 中显式初始化。