Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Class 在Racket类中使用'private'(和'define/private')形式_Class_Oop_Object_Racket_Scoping - Fatal编程技术网

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)))啊,好的,我想我知道了。这只在不展开函数时显示。我明白了,谢谢。