2015-09-06 50 views
5

我在看這個窗體的Objective-C背景,所以要溫柔。實驗是這樣的:Pharo Smalltalk - 如何檢查消息是否符合另一個對象類中定義的協議?

Object1有一個名爲委託的實例變量。

Object1接收到一個消息和繼續檢查是否委託實現特定的協議(其名稱被預先已知)中,如果確實如此,那麼它檢查該消息是否是協議的實現的方法之一。然後它決定如何與委託進行交互等。

在Objective-C之一具有定義明確的協議,通常存放在不同的文件中,並符合的協議是由編譯器檢查。在Pharo中,我似乎無法找到如何檢查這種信息,即使瀏覽器有一整列專用於協議,除了分組方法,他們似乎做的很少。

+1

我對Objective-C中的「協議」知之甚少,但你是對的,在Smalltalk中,它們並不僅僅是一種將方法分組的方法(a.k.a.「categories」)。有關如何定義這些協議的約定,以及哪些方法通常使用哪種協議,但它們只是公約。你可以向一個類請求'#allMethodsInCategory:',但除非我誤解了你,否則我不認爲這就是你所追求的,因爲它聽起來像是Objective-C中完全不同的東西。 Leandro的答案爲您提供了一些用於檢查對象響應哪些方法的選項。 –

+1

@ AmosM.Carpenter這正是我一直在尋找的東西,在尋找別的東西的時候自己找到了它。有一種方法#allMethodsInCategory:在Pharo 3.0和以後的版本中已經棄用了#allSelectorsInProtocol:這正是我想要的。請參閱http://stackoverflow.com/questions/2990966/how-can-i-get-all-the-methods-in-a-protocol其他一些方言有methodsInProtocol:都一樣。 – unmircea

回答

5

這裏有一些幾個選擇,可以幫助您與此:

  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:方法如下:

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異常,但我不認爲這是你在這裏尋找的。

+0

從我看到的:#doesNotUnderstand在選擇器的方法找不到後調用。因此,我將在每條消息中獲得這些開銷,並且我也無法轉發基本的Object選擇器,因爲重定向器和委託都是對象,並且重定向器只會在不明白時轉發。 Objective-C具有forwardInvocation:即使在方法查找發生之前,它也會轉發絕對的一切。我們有Smalltalk嗎? – unmircea

+2

看到鬼和論文 –

+0

@unmircea我可能誤解了你的問題。也許你可以編輯它,以幫助我們更好地理解你正在嘗試做什麼。 –

3

代理工作在Ghost/Marea和原來的Smalltalk wrappers to the rescue我不確定代理已經更新爲最新的Pharo版本。最新ghost版本似乎是here

+0

感謝您的快速響應......我一直在尋找像Obj-C [[myObject class] conformsToProtocol:@protocol(MyProtocol)]這樣的更直接的東西;這將支持開箱即用,符合myObject類conformsToProtocol:'無論如何'。 – unmircea

相關問題