Class 在Racket类中使用'private'(和'define/private')形式
球拍有一个Class 在Racket类中使用'private'(和'define/private')形式,class,oop,object,racket,scoping,Class,Oop,Object,Racket,Scoping,球拍有一个private表单,可以用来隐藏方法。这似乎模仿了在其他语言(如Java或C)中使用private。显示使用private隐藏方法的示例: (define light% (class object% (super-new) (define on? #t) (define (toggle) (set! on? (not on?))) (private toggle) (define (flick) (toggle)) (public f
private
表单,可以用来隐藏方法。这似乎模仿了在其他语言(如Java或C)中使用private。显示使用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)
在这两种情况下,类之外的作用域都不能访问切换
,但它们可以访问flick
,因为它被标记为公共
那么,
private
用于什么,为什么它仍然在语言中?在第二种情况下,toggle
不是一种方法;它是一个私有字段,其值为闭包。特别是,为每个light%
对象分配一个新的切换
闭包
使用(private toggle)
,将toggle
方法定义转换为为此获取额外参数,并通过该参数解析字段引用。大概是这样的:
(define (toggle-impl this-obj)
(set-light%-on?! this-obj (not (light%-on? this-obj))))
由于它不再关闭此
,因此该过程可以与类同时分配一次。类
宏将切换
绑定到一个宏,该宏重写对切换
的所有调用,以传递隐式此
参数。(这就是为什么方法名称不是值;如果要将方法映射到列表上,则必须展开,使方法名称处于运算符位置。)好的。所以这似乎意味着分配一个方法,而不是每个对象实例分配一个方法。这是有道理的。你能给我举一个最终结果不同的例子吗?我这么说是因为即使是“this”也似乎是在私有方法中绑定的:(define light%(class object%(super new)(field[on?#t])(define/private(toggle)(set!on?(not on?)(displayln(get field on?this))(define(toggle2)(set!on?(未打开?)(displayln(获取字段?此))(定义/公共(flick)(toggle2)(toggle2)))啊,好的,我想我知道了。这只在不展开函数时显示。我明白了,谢谢。