簡體   English   中英

Pharo Smalltalk-如何檢查消息是否符合另一個對象的Class中定義的協議?

[英]Pharo Smalltalk - How can I check if a message conforms to a protocol defined in another object's Class?

我正在從Objective-C的背景看這個表格,所以要保持溫柔。 實驗如下:

Object1有一個名為委托的實例變量。

Object1收到一條消息,然后繼續檢查委托是否實現了特定協議(其名稱是事先已知的),如果是,則檢查消息是否在協議的已實現方法中。 然后,它決定如何與委托人進行交互等等。

在Objective-C中,必須定義清晰的協議,通常存儲在不同的文件中,並由編譯器檢查是否符合協議。 在Pharo中,即使瀏覽器有一整列專門討論協議,我似乎也找不到如何檢查此類信息的方法,而在分組方法之外,它們似乎做得很少。

以下是一些可以幫助您解決此問題的方法:

  1. 獲取填充對象類的所有選擇器的集合:
    • anObject class selectors
  2. 獲取填充該對象的類及其所有超類的所有選擇器的集合:
    • anObject class allSelectors
  3. 詢問類是否實現了給定消息(針對其實例):
    • anObject class canUnderstand: #putTheSelectorHere
  4. 詢問對象是否理解給定消息:
    • anObject respondsTo: #methodSelectorHere
  5. 使用MessageNotUnderstood機制:
    • (請參閱下面的說明)

在上面的1和2中,您可以使用返回的集合來檢查它們是否包含您感興趣的某個選擇器。功能3、4和5具有更動態的性質。 例如,您可以#doesNotUnderstand:方式優化類中的#doesNotUnderstand:方法:

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

這樣,如果您的對象收到一條它不理解的消息,它將首先收到#doesNotUnderstand:消息(無需為此做任何事情),然后您就可以決定(例如,使用#respondsTo:消息)是否委托它。 如果不是這樣,您可以繼續默認行為( super doesNotUnderstand: ,這將發出MessageNotUnderstood異常信號。

當然,有第6個選項,它將用於消息的發件人處理MNU異常,但是我認為這不是您在這里尋找的。

Ghost / Marea中有代理工作,並且原始的Smalltalk 包裝程序可以挽救我不確定代理是否已針對最新的Pharo版本進行了更新。 最新的幽靈版本似乎在這里

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM