【问题标题】:VisualWorks Smalltalk - can't access parent's methodsVisualWorks Smalltalk - 无法访问父母的方法
【发布时间】:2013-11-30 18:45:40
【问题描述】:

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

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

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

编辑: 完整的错误信息是:

【问题讨论】:

  • 您能否转发消息不理解错误的完整消息?我想知道它认为什么对象不理解 setName:。从表面上看,它应该可以工作。
  • 这正是我的想法。我添加了带有完整错误消息的 EDIT。

标签: oop inheritance methods smalltalk visualworks


【解决方案1】:

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

【讨论】:

  • 是的。我的意思是——当我启动一个调试器时,我可以看到它是如何被初始化的,以及它是如何调用 Field 的“初始化”方法的。在那之后,当谈到“setName:”时,一切都失败了。 CheckBox 类是浏览器中唯一的此类。但是,我发现在选择“名称”后的“实例变量”下,右侧窗格中没有列出任何内容,当我选择“字段”->“实例变量”->“名称”时,我看到了 setName:方法。也许这与问题有关?
  • 对于 CheckBox 类,当您在实例变量选项卡中选择“名称”时,您不会在右侧窗格中看到任何内容,因为 CheckBox 没有任何引用名称的方法。它应该从 Field 继承这些方法。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 好的,但这并不能解释您所看到的症状。方法默认返回 self。我怀疑您关闭了将 CheckBox 变量定义为 nil 的工作区,然后在新工作区中运行代码。无论如何,不​​客气。
    【解决方案4】:

    我在 Checkbox 类上看不到 #initialize 方法,
    但由于某种原因,它的答案是 nil。

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

    删除回答 nil 的行 也可以。

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

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

    因此您将始终获得新实例,
    而不是这样 --

    >>新 ^超级新初始化

    这样你总能得到它是什么
    #initialize 方法恰好回答。

    【讨论】:

      猜你喜欢
      • 2021-01-11
      • 1970-01-01
      • 2020-02-24
      • 1970-01-01
      • 2015-07-28
      • 2020-01-07
      • 1970-01-01
      • 1970-01-01
      • 2014-03-25
      相关资源
      最近更新 更多