文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
4.1 消息转发
我们可以做得更好,让每个对象都有一个特殊的“伙伴”对象,任何不理解的消息都自动转发给它。可以定义新的语法抽象 OBJECT-FWD
用于构造这样的对象:
(defmac (OBJECT-FWD target
([field fname init] ...)
([method mname args body] ...))
#:keywords field method
#:captures self
(letrec ([self
(let ([fname init] ...)
(let ([methods (list (cons 'mname (λ args body)) ...)])
(λ (msg . vals)
(let ([found (assoc msg methods)])
(if found
(apply (cdr found) vals)
(apply target msg vals))))))])
self))
请注意这里语法的扩展,指定了 target
对象;只要某条消息在对象的方法中找不到,调度过程就会使用 target
对象。当然,如果所有对象都将未知消息转发给其他对象,那么传递链中必须有个最后的对象,该对象在收到消息时可以简单报错:
(define root
(λ (msg . args)
(error "not understood" msg)))
于是 broker
可以这样定义:
(define broker
(OBJECT-FWD seller () ()))
这就是说, broker
是个空对象(不含字段,不含方法),只是将所有发送给它的消息转发给 seller
:
> (-> broker price 2)
200
> (-> broker unit)
1
这种对象通常被称为 代理 (proxy)。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论