文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
4.5 词法作用域和委托
正如之前所讨论的,在我们的系统中可以定义 嵌套的对象 。词法嵌套与委托之间的关系蛮有意思的,值得讨论一下。考虑下面的例子:
(define parent
(OBJECT-DEL root ()
([method foo () 1])))
(define outer
(OBJECT-DEL root
([field foo (λ () 2)])
([method foo () 3]
[method get ()
(OBJECT-DEL parent ()
([method get-foo1 () (foo)]
[method get-foo2 () (-> self foo)]))])))
(define inner (-> outer get))
> (-> inner get-foo1)
2
> (-> inner get-foo2)
1
可以看到,自由标识符在词法环境中查找(见 get-foo1
),未知消息在委托链上进行查找(见 get-foo2
)。这点需要澄清,因为 Java 程序员习惯的是 this.foo()
等同于 foo()
。在许多同时支持词法嵌套和某种形式的委托(如继承)的语言中,情况并非如此。
其他语言对此有不同的处理。参见 Newspeak 和 AmbientTalk。
Java 是怎么处理的? 试试就知道了!继承链屏蔽(shadow)了词法链:使用 foo()
时,如果能在超类中找到方法,则会调用该方法;只有在找不到方法时,才使用词法环境(即 outer
对象中的 foo
)。因此,对 outer
对象的引用是非常脆弱的。这就是为什么 Java 支持额外的语法形式 Outer.this
来引用外层对象。当然,如果直接外层对象的类中找不到方法,那么就继续在它的超类中查找,而不是往词法链上。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

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