VisualWorks Smalltalk - 无法访问父方法

时间:2013-11-17 17:32:07

标签: oop inheritance methods smalltalk visualworks

我有类继承问题 - 我有两个类定义如下:

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:方法吗?我到处试图找到答案,但到目前为止还没有运气。

编辑: 完整的错误消息是: Error message #1 Error message #2

4 个答案:

答案 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方法碰巧回答。