2

我正在阅读 smalltalk 中的代理模式实现,它是使用 dosNotUnderstand 实现的。我没有得到它什么时候会像场景中那样调用这个方法。有人可以给我一个例子/场景。

4

2 回答 2

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.

于 2013-04-24T10:38:22.277 回答
0

更简单地说,“执行”就像 Lisp 的“应用”。(应用 aFunction anArgumentList)

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

例子:

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

(应用 (cadr '(* +)) '(2 3 4)) = 9

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

于 2013-12-06T10:02:37.270 回答