我正在看这个形式的Objective-C背景,所以要温柔。实验看起来像这样:
Object1有一个名为delegate的实例变量。
Object1收到一条消息并继续检查委托是否实现了一个特定的协议(其名称是事先已知的),如果是,则检查该消息是否在协议的实现方法中。然后它决定如何与代表交互等等。
在Objective-C中,必须定义明确的协议,通常存储在不同的文件中,并且编译器会检查是否符合协议。在Pharo中我似乎无法找到如何检查这种信息,即使浏览器有一整列专用于协议,除了分组方法,它们似乎做得很少。
答案 0 :(得分:6)
以下是一些可以帮助您解决此问题的替代方案:
anObject class selectors
anObject class allSelectors
anObject class canUnderstand: #putTheSelectorHere
anObject respondsTo: #methodSelectorHere
MessageNotUnderstood
机制:
在上面的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例外,但我不认为这是你在这里寻找的。 p>
答案 1 :(得分:3)
代理工作在Ghost/Marea和原始的Smalltalk wrappers to the rescue我不确定代理是否已针对最新的Pharo版本进行了更新。最新的鬼版似乎是here