gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 13:59:13 24 4
gpt4 key购买 nike

我正在看这种形式的 Objective-C 背景,所以要温柔。实验如下所示:

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

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

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

最佳答案

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

  • 获取填充对象类的所有选择器的集合:
  • anObject class selectors
  • 获取填充对象的类及其所有父类(super class)的所有选择器的集合:
  • 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: 消息)是否委托(delegate)它。如果没有,您可以只中继默认行为( super doesNotUnderstand: ),这将发出信号 de MessageNotUnderstood异常(exception)。

    当然,还有第 6 个选项,即让消息的发送者处理 MNU 异常,但我认为这不是您要在这里寻找的。

    关于smalltalk - Pharo Smalltalk - 如何检查消息是否符合在另一个对象的类中定义的协议(protocol)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32422955/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com