【发布时间】:2011-04-23 00:56:19
【问题描述】:
如何在 Smalltalk 中创建自己的事件?我基本上是在寻找一些可以在某些特定事件发生时触发的软件事件。
【问题讨论】:
标签: events event-handling smalltalk squeak
如何在 Smalltalk 中创建自己的事件?我基本上是在寻找一些可以在某些特定事件发生时触发的软件事件。
【问题讨论】:
标签: events event-handling smalltalk squeak
在经典的 Smalltalk(由 Squeak 支持,作为原始 XEROX Parc 图像的直接衍生产品)中,您有一个基本的发布/订阅模型。在对象实例的协议浏览器中查找“事件”。
在现代 Smalltalk 中,您可以使用 Exception 类及其子类来捕获/抛出用户定义的事件。有关详细信息,请参阅 Exception 的类文档。
您还可以选择 Squeaksource 中提供的 Announcements 框架,作为经典事件框架的更灵活版本。
【讨论】:
回顾一下,事件基于Observer Pattern,其中主题有依赖者观察选定的事件。
这会在它们之间创建loose coupling 的关系。
在 Squeak 或 Pharo 中,在某种同时知道主体和观察者的方法中,你会这样做:
观察
elevatorPanel when: #openDoorClicked send: #onOpenDoorClicked to: elevator
事件触发
另一方面,自我是电梯面板:
self triggerEvent: #openDoorClicked
您将让elevator 接收onOpenDoorClicked 消息。
同样,您可以使用参数来做到这一点:
elevatorPanel when: #floorSelected: send: #onFloorSelected: to: elevator with: floorNumber
在这种情况下你可以通过两种方式触发,第一种
self triggerEvent: #floorSelected:
Wich 将使elevator 观察者实例以floorNumber 作为参数接收onFloorSelected: 消息。
其次,在触发时覆盖该值
self triggerEvent: #floorSelected: with: aFresherFloorValue
在这种情况下,您还将让elevator 接收onFloorSelected:,但使用aFresherFloorValue 而不是在观察设置期间捕获的floorValue。
【讨论】: