Pharo Smalltalk - 如何检查消息是否符合另一个对象类中定义的协议?

时间:2015-09-06 11:16:48

标签: smalltalk pharo

我正在看这个形式的Objective-C背景,所以要温柔。实验看起来像这样:

Object1有一个名为delegate的实例变量。

Object1收到一条消息并继续检查委托是否实现了一个特定的协议(其名称是事先已知的),如果是,则检查该消息是否在协议的实现方法中。然后它决定如何与代表交互等等。

在Objective-C中,必须定义明确的协议,通常存储在不同的文件中,并且编译器会检查是否符合协议。在Pharo中我似乎无法找到如何检查这种信息,即使浏览器有一整列专用于协议,除了分组方法,它们似乎做得很少。

2 个答案:

答案 0 :(得分:6)

以下是一些可以帮助您解决此问题的替代方案:

  1. 获取填充对象类的所有选择器的集合:
    • anObject class selectors
  2. 获取填充对象类及其所有超类的所有选择器的集合:
    • anObject class allSelectors
  3. 询问类是否实现了给定的消息(对于它的实例):
    • anObject class canUnderstand: #putTheSelectorHere
  4. 询问对象是否理解给定的消息:
    • anObject respondsTo: #methodSelectorHere
  5. 使用MessageNotUnderstood机制:
    • (见下文解释)
  6. 在上面的1和2中,您可以使用返回的集合来检查它们是否包含您感兴趣的某个选择器。功能3,4和5具有更加动态的特性。例如,您可以按如下方式优化类中的#doesNotUnderstand:方法:

    MyClass >> #doesNotUnderstand: aMessage
        (delegate respondsTo: aMessage selector)
            ifTrue: [^delegate
               perform: aMessage selector
               withArguments: aMessage arguments].
        ^super doesNotUnderstand: aMessage
    

    这样,如果你的对象收到一条它不理解的消息,它将首先收到#doesNotUnderstand:消息(你不必为此做任何事情),在这里你可以决定(例如,通过使用#respondsTo:消息)是否委派它。如果没有,您可以继续使用默认行为(super doesNotUnderstand:)来表示de MessageNotUnderstood异常。

    当然,还有第6个选项,可以让邮件的发件人处理MNU例外,但我不认为这是你在这里寻找的。

答案 1 :(得分:3)

代理工作在Ghost/Marea和原始的Smalltalk wrappers to the rescue我不确定代理是否已针对最新的Pharo版本进行了更新。最新的鬼版似乎是here