Inheritance 如何在Eiffel中正确扩展STRING类

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 该应用程序的代

我刚刚获得了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
该应用程序的代码为:

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-要么在创建指令中没有指定相应的创建过程,要么指定的功能不是创建过程。

您需要提供实际的错误输出。