2017-08-07 72 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) - 創建指令中未指定相應的創建過程,或者指定的功能不是創建過程。