這裏有一些幾個選擇,可以幫助您與此:
- 獲取用於填充對象的類所有選擇的集合:
- 獲取用於填充對象的類和它的所有超所有選擇的集合:
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異常,但我不認爲這是你在這裏尋找的。
我對Objective-C中的「協議」知之甚少,但你是對的,在Smalltalk中,它們並不僅僅是一種將方法分組的方法(a.k.a.「categories」)。有關如何定義這些協議的約定,以及哪些方法通常使用哪種協議,但它們只是公約。你可以向一個類請求'#allMethodsInCategory:',但除非我誤解了你,否則我不認爲這就是你所追求的,因爲它聽起來像是Objective-C中完全不同的東西。 Leandro的答案爲您提供了一些用於檢查對象響應哪些方法的選項。 –
@ AmosM.Carpenter這正是我一直在尋找的東西,在尋找別的東西的時候自己找到了它。有一種方法#allMethodsInCategory:在Pharo 3.0和以後的版本中已經棄用了#allSelectorsInProtocol:這正是我想要的。請參閱http://stackoverflow.com/questions/2990966/how-can-i-get-all-the-methods-in-a-protocol其他一些方言有methodsInProtocol:都一樣。 – unmircea