返回介绍

5.6 匿名类,局部类和嵌套类

发布于 2025-02-20 00:17:08 字数 1163 浏览 0 评论 0 收藏 0

我们扩展了 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文