[英]Delegation in Pharo Smalltalk
在Smalltalk(尤其是在Pharo)中進行委派的最佳方法是什么? 我知道dosNotUnderstand策略,但是它不委托subclassResponsability消息。
我在考慮某種方法,可以將未在類上顯式實現的每個消息發送委派給某個指定的對象,例如我可以使用Groovy中的@Delegate進行操作。 有一些已知的方法可以做到這一點嗎?
doesNotUndersand:
僅適用於對象無法理解的方法(因此名稱),因此,如果您已經實現了一個方法,則將不使用該方法( subclassResponsibility
就是這種情況)。
如果您使用Pharo 5(將於本周(2016年5月)發布),則可以使用MetaLinks。 這有點過頭了,但是您開始所做的似乎並不正確(為什么要委派subclassResponsibility)?
無論哪種情況,MetaLink都可以將運行時行為附加到您的方法中,例如:
您有一些要委托的方法
MyObject>>someMethod
^ self subclassResponsiblity
您希望委托給的對象...
MyObject>>delegate
^ delegate
因此,您創建了一個MetaLink
link := MetaLink new
metaObject: [ :object :selector :arguments |
object delegate perform: selector withArguments: argument ];
selector: #perform:withArguments:;
arguments: #(object selector arguments);
control: #instead.
您可以將其安裝到所需的任何AST方法。
(MyObject>>someMethod ast) link: link.
現在,每次調用該方法時( instead
執行該方法的control:
metaObject:
,消息的參數(如果有)將被賦予metaObject:
的塊。
盡管這應該起作用並且是非常強大的機制,但是目前有一些嚴重的缺點正在解決:
總而言之,這與我所展示的MetaLinks可能有關,但是目前工作量很大,但是我們正在解決這些問題。
Peter所說的是,您可以重寫subclassResponsibility,就像您對dosNotUnderstand方法所做的一樣。 無需覆蓋“ self subclassResponsibility”的每個發送者。
例如,僅委托執行didNotUnderstand
subclassResponsibility
^ self
doesNotUnderstand: (Message selector: thisContext sender selector
arguments: thisContext sender arguments)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.