3

如何在 Smalltalk 中创建自己的事件?我基本上是在寻找一些可以在某些特定事件发生时触发的软件事件。

4

2 回答 2

7

在经典的 Smalltalk 中(由 Squeak 作为原始 XEROX Parc 图像的直接衍生产品提供支持),您有一个基本的发布/订阅模型。在对象实例的协议浏览器中查找“事件”。

在现代 Smalltalk 中,您可以使用 Exception 类及其子类来捕获/抛出用户定义的事件。有关详细信息,请参阅异常的类文档。

您还可以选择 Squeaksource 中提供的 Announcements 框架,作为经典事件框架的更灵活版本。

于 2011-04-23T01:23:45.453 回答
0

回顾一下,事件基于观察者模式,在该模式中,主体依赖者观察选定的事件

这在它们之间创建了松散耦合的关系。

在 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观察者实例接收作为参数的onFloorSelected:消息。floorNumber

其次,在触发时覆盖该值

self triggerEvent: #floorSelected: with: aFresherFloorValue

在这种情况下,您还将在观察设置期间elevator收到onFloorSelected:but withaFresherFloorValue而不是捕获的。floorValue

于 2020-03-04T10:58:10.563 回答