![](/img/trans.png)
[英]Why parent class type reference variable having reference to child class object can't access child class's Methods
[英]VisualWorks Smalltalk - can't access parent's methods
我在類繼承方面遇到問題-我有兩個這樣定義的類:
Smalltalk defineClass: #Field
superclass: #{Core.Object}
indexedType: #none
private: false
instanceVariableNames: 'name type '
classInstanceVariableNames: ''
imports: ''
category: ''
和
Smalltalk defineClass: #CheckBox
superclass: #{Smalltalk.Field}
indexedType: #none
private: false
instanceVariableNames: 'checked '
classInstanceVariableNames: ''
imports: ''
category: ''
在類“字段”中,我有一個方法setName:
setName: n
name := n.
^n
對於這樣的事情,它工作得很好:
|tmp|
tmp := Field new.
tmp setName: 'fancy name'.
,但是在上例中將“字段”更改為“ CheckBox”時,總是得到“未處理的異常:MessageNotUnderstood:#setName:”。 你們知道我應該如何讓我的子類從其父類繼承setName:方法嗎? 我試圖在任何地方找到答案,但到目前為止還沒有運氣。
編輯:完整的錯誤消息是:
不知何故,您的CheckBox類沒有得到編譯。 檢查拼寫。 確保沒有名為CheckBox的現有類。 確保您可以在瀏覽器中看到CheckBox類。
有點麻煩-在工作區窗口中,轉到“變量”選項卡,並確保沒有名為CheckBox的變量。 如果是這樣,請將其刪除,然后重試。
好的,這是我的問題的答案:我很愚蠢。 我在弄亂我的CheckBox初始化方法,並在最后意外刪除了^ self行。 將其放回原處后,一切正常。 大衛,感謝您的幫助,也很抱歉抽出寶貴的時間。
我在Checkbox類上看不到#initialize方法,
但是由於某種原因,答案是零。
當您更改最后一行時,它會回答自己,
您還更改了導致方法回答nil的所有內容。
刪除回答nil的行也可以。
如果您像這樣編寫#new方法,則可以避免此問題-
>>new ^self basicNew initialize ; yourself
因此您將始終獲得新實例,
而不是這樣-
>>new ^super new initialize
這樣你總是得到什么
#initialize方法正好回答。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.