【发布时间】:2017-08-10 21:38:58
【问题描述】:
Racket 的classs 有一个private 表单,可以用来隐藏方法。这似乎模仿了在 Java 或 C# 等其他语言中使用 private。 The docs 展示了一个使用 private 隐藏方法的例子:
(define light%
(class object%
(super-new)
(define on? #t)
(define (toggle) (set! on? (not on?)))
(private toggle)
(define (flick) (toggle))
(public flick)))
> (send (new light%) toggle)
send: no such method
method name: toggle
class name: light%
> (send (new light%) flick)
但是,默认情况下,方法似乎是私有的,无论是否实际使用了 private 关键字。例如,修改文档中的示例会产生相同的结果:
(define light%
(class object%
(super-new)
(define on? #t)
(define (toggle) (set! on? (not on?)))
(define (flick) (toggle))
(public flick)))
> (send (new light%) toggle)
send: no such method
method name: toggle
class name: light%
> (send (new light%) flick)
在这两种情况下,类之外的作用域都无法访问toggle,但它们可以访问flick,因为它被标记为public。
那么,private 是用来做什么的,为什么它仍然是语言?
【问题讨论】:
标签: class oop object racket scoping