[英]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.