我有类继承问题 - 我有两个类定义如下:
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: ''
在'Field'类中的我有一个方法setName:
setName: n
name := n.
^n
对于像这样的事情它完全正常:
|tmp|
tmp := Field new.
tmp setName: 'fancy name'.
,但是当我在上面的例子中将'Field'更改为'CheckBox'时,我总是得到“Unhandled Exception:MessageNotUnderstood:#setName:”。你们知道我怎么能让我的子类从它的父级继承一个setName:方法吗?我到处试图找到答案,但到目前为止还没有运气。
编辑: 完整的错误消息是:
答案 0 :(得分:2)
不知何故,你的CheckBox类没有被编译。检查拼写。确保没有名为CheckBox的现有类。确保您可以在浏览器中看到CheckBox类。
答案 1 :(得分:0)
只是在你的工作区窗口中,转到“变量”选项卡,确保没有名为CheckBox的变量。如果是这样,请将其删除并重试。
答案 2 :(得分:0)
好的,这是我的问题:我很愚蠢。我正在搞乱我的CheckBox初始化方法,并在最后意外删除^ self line。把它放回去之后一切正常。感谢大家的帮助,抱歉花时间。
答案 3 :(得分:0)
我在Checkbox类上看不到#initialize方法,
但出于某种原因,这是回答零。
当你改变最后一行时,它会回答自己,
你也改变了导致该方法回答的所有内容。
删除回答为nil的行 也会有效。
你可以避免这个问题如果你写这样的#new方法 -
>>new ^self basicNew initialize ; yourself
所以你总是得到新的实例,
而不是像这样 -
>>new ^super new initialize
通过这种方式,你可以随时得到它 #initialize方法碰巧回答。