Inheritance 如何在Eiffel中正确扩展STRING类
我刚刚获得了ACCOUNT旧示例,并使用字符串所有者的类型编写了一些代码:Inheritance 如何在Eiffel中正确扩展STRING类,inheritance,eiffel,Inheritance,Eiffel,我刚刚获得了ACCOUNT旧示例,并使用字符串所有者的类型编写了一些代码: class ACCOUNT create make feature balance: INTEGER owner: STRING make do create owner.make_empty end minimum_balance: INTEGER = 1000 open (who: STRING) do owner := who end 该应用程序的代
class
ACCOUNT
create
make
feature
balance: INTEGER
owner: STRING
make
do
create owner.make_empty
end
minimum_balance: INTEGER = 1000
open (who: STRING)
do
owner := who
end
该应用程序的代码为:
acc: ACCOUNT
make
do
create acc.make
acc.open ("Jill")
...
它被编译并运行。在我想将所有者类型更改为PERSON之后
owner: PERSON
...
open (who: PERSON)
do
owner := who
end
我创建了PERSON类作为STRING类的扩展:
class
PERSON
inherit
STRING
end
我相信这在每种语言中都适用,但在埃菲尔铁塔中似乎不行。
代码无法编译,带有VGCC6和VEVI错误。有什么想法吗 出于以下几个原因,我不建议将一个人作为字符串的后代: 这并不能正确地模拟外部世界:一个人有名字,而不是名字。特别是,允许更改姓名,例如婚后,但这不会更改此人 这将公开与人无关的字符串特征。例如,什么应该返回特征分割 这在person和字符串之间引入了不必要的依赖关系 最后一点对于理解为什么会出现编译时错误至关重要:后代必须满足祖先的不变量。不变量之一是附加类型的属性应该在创建过程中初始化。在代码中没有初始化属性的创建过程,因此默认创建过程default_create的错误VEVI为空,除非重新定义
类似地,创建person对象时,需要调用创建过程。但是在PERSON类中没有指定创建过程,因此编译器报告VGC6-要么在创建指令中没有指定相应的创建过程,要么指定的功能不是创建过程。您需要提供实际的错误输出。