2017-08-07 68 views
0

适当延长String类,我刚拿到帐号的老样本,编写一些代码与STRING所有者的类型:如何在艾菲尔

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") 
     ... 

它被编译和工作。之后,我想老板类型更改为一个人

owner: PERSON 
... 
open (who: PERSON) 
    do 
     owner := who 
    end 

,我创建了Person类只是作为一个扩展String类:

class 
PERSON 
inherit 
STRING 
end 

我相信这可以在每一种语言工作,但似乎没有在埃菲尔。 代码无法编译VGCC(6)和VEVI错误。有任何想法吗?

+0

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

回答

1

我不会推荐使一个人成为字符串的后代有以下几个原因:

  • 这并不是外界正常模式:一个人有一个名字,它是不是一个名字。特别是,允许​​改变姓名(例如结婚后),但这不会改变该人。

  • 这暴露了与人无关的字符串的特征。例如,应该返回什么特征split

  • 这引入了人与字符串之间不必要的依赖关系。

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

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