[英]How can I easily change to native fonts in Smalltalk Squeak/Pharo
[英]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中,即使瀏覽器有一整列專門討論協議,我似乎也找不到如何檢查此類信息的方法,而在分組方法之外,它們似乎做得很少。
以下是一些可以幫助您解決此問題的方法:
anObject class selectors
anObject class allSelectors
anObject class canUnderstand: #putTheSelectorHere
anObject respondsTo: #methodSelectorHere
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.