smalltalk中的代理模式实现

时间:2013-04-24 04:19:38

标签: design-patterns smalltalk

我正在阅读使用doesNotUnderstand实现的smalltalk中的代理模式实现。 如果在方案中调用此方法,我没有得到它。有人可以给我一个例子/场景。

2 个答案:

答案 0 :(得分:5)

如果方法查找失败,则会调用

doesNotUnderstand:或DNU而不是原始消息。以下示例

nil aSelectorThatDoesNotExist

触发Object上的默认DNU,这将引发MessageNotUnderstood异常。

您可以使用doesNotUnderstand:协议轻松地将消息发送委托给另一个对象。例如,如果我在Proxy上添加以下方法,

doesNotUnderstand: aMessage
    ^ target perform: aMessage selector withArguments: aMessage arguments

它会将Proxy本身未实现的所有消息转发给另一个target对象。这里重要的是Proxy对象应尽可能少地实现方法,否则无法转发它们。因此,PharoSqueak只有ProtoObject,它只实现了一组基本方法。通常,代理继承自ProtoObject

答案 1 :(得分:0)

更基本上,“执行”就像Lisp“apply”。(应用aFunction anArgumentList)

aFunction和anArgumentList是要评估的表达式。

示例:

  

(申请(车'(* +))'(2 3 4))   = 24

     

(申请(cadr'(* +))'(2 3 4))   = 9

它可以实现计算的函数调用(并通过扩展计算的消息发送)。