【问题标题】:Accessing instance variables in an eventhandler with smalltalk使用 smalltalk 访问事件处理程序中的实例变量
【发布时间】:2012-12-29 15:12:02
【问题描述】:

我对 smalltalk 还很陌生,一个看似简单的问题让我抓狂。 我自己的类继承自 Morphic 类并覆盖 keyStroke

keyStroke: anEvent
Transcript show: myDigitClass.
(((anEvent keyValue) > 47) and: ((anEvent keyValue) < 58)) ifTrue: [
    "myDigitClass dropADigit"
    "myDigitClass setADigit: (anEvent keyValue) asCharacter."
    Transcript show: (anEvent keyValue) asCharacter
    ]

到目前为止有效,Transcript 显示了我在键盘上所做的输入但是即使我初始化了这个变量并通过 setter 方法将它传递给这个类,实例变量 myDigitClass 也是 NIL .如果通过我编写的 getter 方法访问 myDigitClass 就可以了。

我调用 showPane 方法并将输入参数 digitMD 分配给实例 Var。

showPane: digitMD
  |pane|
  myDigitClass := digitMD.

  pane := DigitMorph new.
  pane extent: 340@340.
  ^pane openInWorld.

在工作区中,我执行以下操作:

 myDigitClass := DigitClass new.
 myTest := DigitMorph new.
 myTest showPane: myDigitClass.

【问题讨论】:

  • 您使用什么方言?法罗、吱吱声、大众、弗吉尼亚州……?
  • 看完你的上一条评论后,我想看看你初始化变量的代码以及你用来声明类的代码(定义实例变量的地方)。
  • 好的,我已将其附加到我的问题发布中。
  • 我尝试重新创建您的设置,但我需要知道层次结构:DigitClassDigitMorph 从哪些类继承?我需要任何其他方法来让你的例子继续下去吗?如果可以的话,给我一个包含所有相关类的文件,我猜这将是最简单的方法。
  • 感谢您的帮助!我终于解决了这个问题,在我绘制窗口的“显示”方法中,我再次实例化了我覆盖的变形,所以引用是错误的。我不知道魔鬼在我身上得到了什么;)

标签: event-handling smalltalk squeak


【解决方案1】:

您可以通过发送对象#instVarNamed: 直接访问实例变量。这是一种私有方法,只有在您知道自己在做什么或用于调试时才应使用。

假设您的类的实例变量名为theDigit,您将在示例中使用#instVarNamed:

...
Transcript show: (myDigitClass instVarNamed: 'theDigit').
...

脚本将显示有效存储的值(例如nil)。

【讨论】:

  • 谢谢你的回答,但是我不明白。
  • 很抱歉。我更新了我的答案以包含更多细节。让我知道这是否有帮助。
【解决方案2】:

这个问题很模糊......
你怎么知道实例变量是 NIL (nil?)?
是你在成绩单中得到的吗?

请注意,Transcript show: 惯用语通常与字符串参数一起使用。
否则,它会将 asString 发送到参数(至少在 Squeak 中)。

yourMorph yourDigitGetter asString 会回答什么?

【讨论】:

  • 重点是我想调用我在上面的 sn-p 中注释掉的 dropADigit/setADigit 方法。但如果我这样做,我会收到“MessageNotUnderstood”错误。因此,我尝试向我显示脚本中的实例变量,但我得到一个 nil,但如果调用以下方法:getDigitMD ^(myDigitClass). 并将结果保存在工作区中并显示给我,它会打印出“a DigitClass”。跨度>
  • 您的意思是当您使用“打印”菜单时?这将调用不同的方法#printString,不一定与#asString 相同。当你有一个 MessageNotUnderstood 时,最好的办法是打开调试器,从那里你可以检查对象的所有状态。
猜你喜欢
  • 1970-01-01
  • 2014-07-18
  • 2016-09-22
  • 2011-03-05
  • 2015-06-17
  • 2023-04-02
  • 2016-09-17
相关资源
最近更新 更多