簡體   English   中英

Pharo Smalltalk中的代表團

[英]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.

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