文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
5.6 匿名类,局部类和嵌套类
我们扩展了 Scheme,引入了类。扩展的方式类似于之前的对象系统,类表示为一等(first-class)函数。这意味着,我们语言中的类是一等的实体,例如可以作为参数传递(参见前面 create
函数的定义)。另外,我们的系统也支持匿名类和嵌套的类。当然,这一切都建立在遵从词法作用域规则的基础上。
(define (cst-class-factory cst)
(CLASS () ([method add (n) (+ n cst)]
[method sub (n) (- n cst)]
[method mul (n) (* n cst)])))
(define Ops10 (cst-class-factory 10))
(define Ops100 (cst-class-factory 100))
> (-> (new Ops10) add 10)
20
> (-> (new Ops100) mul 2)
200
我们也可以在局部作用域中引入类。也就是说,不同于类是全局可见的一阶实体的语言,我们可以在局部作用域中定义类。
(define doubleton
(let ([the-class (CLASS ([field x 0])
([method initialize (x) (-> self x! x)]
[method x? () (? x)]
[method x! (new-x) (! x new-x)]))])
(let ([obj1 (new the-class 1)]
[obj2 (new the-class 2)])
(cons obj1 obj2))))
> (-> (cdr doubleton) x?)
2
在这里,引入 the-class
的的目的仅在于创建两个实例,然后以对的形式返回这两个实例。在那之后,这个类就不再可用了。换种说法,无法再创建这个类的更多实例了。不过,我们创建的这两个实例当然仍然指向它们的类,因此这些对象仍可以使用。有趣的是,一旦这些对象被垃圾收集,他们的类也可以被收回。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

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