如何在Eiffel中正确扩展STRING类

时间:2017-08-07 17:26:12

标签: inheritance eiffel

我刚刚获得了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错误进行编译。有任何想法吗?

1 个答案:

答案 0 :(得分:1)

我不建议将某人作为字符串的后代,原因如下:

  • 这不能正确地模拟外部世界:一个人有一个名字,它不是一个名字。特别是,允许​​更改名称(例如,婚后),但这不会改变此人。

  • 这会公开与人无关的字符串功能。例如,应该返回功能split

  • 这会在人和字符串之间引入不必要的依赖关系。

最后一点对于理解为什么会出现编译时错误至关重要:后代必须满足祖先的不变量。其中一个不变量是附加类型的属性应该在创建过程中初始化。在您的代码中,没有初始化属性的创建过程,因此默认创建过程default_create的错误VEVI为空,除非重新定义。

同样,在创建person对象时,需要调用创建过程。但是在类PERSON中没有指定创建过程,因此编译器报告VGCC(6) - 在创建指令中未指定相应的创建过程,或者指定的特征不是创建过程。