【问题标题】:Saving modifications to existing kernel methods to Monticello将对现有内核方法的修改保存到 Monticello
【发布时间】:2013-05-11 08:54:15
【问题描述】:

我正在研究 Phratch(Smalltalk 中的 Scratch 2.0)并修改了 InputEventSensor>>processEvent 方法以存储最后按下的键,其方式与存储修饰键的方式类似,以便它们 if <key> pressed 阻塞工作。

所以我现在有一个自定义的 InputEventSensor 类:

  • 新的实例变量keyPressed
  • 修改方法processEvent
  • 新方法keyPressedclearKeystate

新方法属于*Phratch 类别,这很好,因此这些方法会保存到 Phratch Monticello 包中。但是processEvent 呢,是否应该将其移至*Phratch 类别?实例变量呢?

【问题讨论】:

  • 顺便说一句,我花了很多时间试图不更改 InputEventSensor 类,但无法让事件处理正常工作。我查看了原始的 Scratch + Squeak 源代码,可以看到他们已经按照这些思路做了一些事情,所以我复制了他们的方法。

标签: smalltalk pharo monticello


【解决方案1】:

发生了几件事:)。

首先,将现有方法移动到项目的包中就是我们所说的覆盖。也就是说,当您将包加载到图像中时,现有方法定义将被您的定义覆盖。我不建议仅在极其必要时进行覆盖。实际上,最好的方法应该是创建钩子,将它们集成到 Pharo 的代码库中,然后将您的项目插入给定的钩子中:)。

在使用实例变量扩展类时,我认为 Monticello 并没有真正处理这个问题。一种可能的解决方案是在 metacello 配置中添加预加载操作,将实例变量添加到给定的类。这样,inst var 就安装在方法之前。

第三个也是最后一个,了解某个键是否仍被按下的实际好方法是监听 KeyDown 和 KeyUp 事件。给出 KeyUp 事件时释放一个键。但是,keyDown 和 keyUp 事件现在在 Pharo 上不能正常工作(在所有平台上,识别键的键码会产生操作系统特定的值,并且有些键还没有得到很好的处理)。但是,我相信这会在即将推出的 3.0 版本的 Pharo 中变得更好。

当然,如果你想让这几点变得更好,你可以贡献自己的力量:)。

【讨论】:

  • 感谢 guillepolito 的建议,我仍在学习 Smalltalk 并感谢听到正确的做事方式。因此,我将研究在 Phratch 中执行此操作的更好方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多