簡體   English   中英

如何在Eiffel中正確擴展STRING類

[英]How to extend STRING class properly in Eiffel

我剛剛得到了ACCOUNT舊示例,並使用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")
        ...

它已編譯並可以工作。 我想將所有者類型更改為PERSON后

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

我創建了PERSON類,作為對STRING類的擴展:

class
PERSON
inherit
STRING
end

我相信這可以在每種語言中使用,但似乎不適用於埃菲爾。 該代碼無法編譯為VGCC(6)和VEVI錯誤。 有任何想法嗎?

我不建議將一個人作為字符串的后代,原因如下:

  • 這不能正確地模擬外部世界:一個人有名字,但不是名字。 特別是允許更改姓名(例如,結婚后),但這不會更改該人。

  • 這將顯示與人無關的字符串功能。 例如,應該返回什么特征split

  • 這在人和字符串之間引入了不必要的依賴性。

最后一點對於理解為什么會出現編譯時錯誤至關重要:后代必須實現祖先的不變式。 不變量之一是附加類型的屬性應在創建過程中初始化。 在您的代碼中,沒有用於初始化屬性的創建過程,因此,除非重新定義,否則默認創建過程default_create的錯誤VEVI為空。

同樣,在創建人員對象時,需要調用創建過程。 但是在PERSON類中,沒有指定創建過程,因此編譯器報告VGCC(6)-在創建指令中未指定相應的創建過程,或者指定的功能不是創建過程。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM