重命名为继承人后变量未正确设置
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_generation
和 current_day_consumption
。 NRJ_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 中显式初始化。
我知道如何修复它(参见我的解决方案@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_generation
和 current_day_consumption
。 NRJ_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 中显式初始化。