【问题标题】:Event Handling in Smalltalk(squeak)Smalltalk 中的事件处理(squeak)
【发布时间】:2011-04-23 00:56:19
【问题描述】:

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

【问题讨论】:

    标签: events event-handling smalltalk squeak


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      回顾一下,事件基于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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多