0

我知道如何修复它(请参阅我的解决方案@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_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
4

1 回答 1

1

NRJ_GENERATOR_CONSUMER有两个版本的每个属性NRJ_ENTITY。例如,current_day有版本current_day_generationcurrent_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_createNRJ_ENTITY

摘要:继承的代码只处理选定版本的复制功能。

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

于 2019-12-29T13:03:52.327 回答