我正在阅读使用doesNotUnderstand实现的smalltalk中的代理模式实现。 如果在方案中调用此方法,我没有得到它。有人可以给我一个例子/场景。
答案 0 :(得分:5)
doesNotUnderstand:
或DNU而不是原始消息。以下示例
nil aSelectorThatDoesNotExist
触发Object上的默认DNU,这将引发MessageNotUnderstood
异常。
您可以使用doesNotUnderstand:
协议轻松地将消息发送委托给另一个对象。例如,如果我在Proxy
上添加以下方法,
doesNotUnderstand: aMessage
^ target perform: aMessage selector withArguments: aMessage arguments
它会将Proxy
本身未实现的所有消息转发给另一个target
对象。这里重要的是Proxy
对象应尽可能少地实现方法,否则无法转发它们。因此,Pharo或Squeak只有ProtoObject
,它只实现了一组基本方法。通常,代理继承自ProtoObject
。
答案 1 :(得分:0)
更基本上,“执行”就像Lisp“apply”。(应用aFunction anArgumentList)
aFunction和anArgumentList是要评估的表达式。
示例:强>
(申请(车'(* +))'(2 3 4)) = 24
(申请(cadr'(* +))'(2 3 4)) = 9
它可以实现计算的函数调用(并通过扩展计算的消息发送)。