1

我有一个类继承问题 - 我有两个这样定义的类:

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'.

,但是当我在上面的示例中将 'Field' 更改为 'CheckBox' 时,我总是得到“Unhandled Exception: MessageNotUnderstood: #setName:”。你们知道我应该如何让我的子类从它的父类继承 setName: 方法吗?我试图到处寻找答案,但到目前为止还没有运气。

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

4

4 回答 4

2

不知何故,您的 CheckBox 类没有被编译。检查拼写。确保不存在名为 CheckBox 的现有类。确保您可以在浏览器中看到 CheckBox 类。

于 2013-11-17T18:11:49.033 回答
0

只是开玩笑-在您的工作区窗口中,转到“变量”选项卡并确保您没有名为 CheckBox 的变量。如果是这样,请将其删除并重试。

于 2013-11-17T19:09:07.950 回答
0

好的,这是我的问题的答案:我很愚蠢。我在搞乱我的 CheckBox 初始化方法,最后不小心删除了 ^self 行。放回原处后一切正常。谢谢你的帮助,大卫,很抱歉耽误了你的时间。

于 2013-11-17T19:23:59.627 回答
0

我在您的 Checkbox 类上看不到#initialize 方法,
但由于某种原因,它回答为零。

当您更改最后一行时,它会回答 self,
您也更改了导致该方法回答 nil 的任何内容。

删除回答 nil 的行也可以。

你可以避免这个问题如果你像这样编写你的#new方法 -

  >>新
      ^self basicNew
          初始化
          ; 你自己

所以你总是会得到新的实例,
而不是像这样——

  >>新
      ^超级新初始化

因此,您总是会得到
#initialize 方法恰好回答的任何内容。

于 2014-10-07T00:26:21.860 回答