我刚刚获得了ACCOUNT旧样本并使用STRING所有者类型编写了一些代码:
yr
应用程序的代码是:
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
它是编译和工作的。我想将所有者类型更改为PERSON
之后acc: ACCOUNT
make
do
create acc.make
acc.open ("Jill")
...
我创建了PERSON类,作为STRING类的扩展:
owner: PERSON
...
open (who: PERSON)
do
owner := who
end
我相信这可以用于所有语言,但似乎不适用于埃菲尔。 代码无法使用VGCC(6)和VEVI错误进行编译。有任何想法吗?
答案 0 :(得分:1)
我不建议将某人作为字符串的后代,原因如下:
这不能正确地模拟外部世界:一个人有一个名字,它不是一个名字。特别是,允许更改名称(例如,婚后),但这不会改变此人。
这会公开与人无关的字符串功能。例如,应该返回功能split
?
这会在人和字符串之间引入不必要的依赖关系。
最后一点对于理解为什么会出现编译时错误至关重要:后代必须满足祖先的不变量。其中一个不变量是附加类型的属性应该在创建过程中初始化。在您的代码中,没有初始化属性的创建过程,因此默认创建过程default_create
的错误VEVI为空,除非重新定义。
同样,在创建person对象时,需要调用创建过程。但是在类PERSON
中没有指定创建过程,因此编译器报告VGCC(6) - 在创建指令中未指定相应的创建过程,或者指定的特征不是创建过程。