class - 设置 Racket 中定义的同一类的另一个对象实例的私有(private)字段

标签 class object field racket

假设我在 Racket 中有一些名为 Five% 的类:

(define five%
  (class object%
    (super-new)
    (define internal 5)
    (define/public (get-number)
      internal)))

假设我已经定义了两个五:

(define f (new five%))
(define g (new five%))

现在,fg 都可以访问自己的内部字段。但是假设我想向 Five% 添加一个函数,称为 change-other ,它接受另一个 Five% 对象,并修改其内部字段。说这样的话:

(define/public (change-other other)
  (set-field! internal other 4))

现在,显然我无法执行此操作,因为 internal 是私有(private)字段,因此 Five% 的任何其他实例都无法访问它。

那么,在 Racket 中是否可以创建一个具有私有(private)字段的类,该字段只能被该类的其他实例访问?

最佳答案

诀窍是将该字段公开,然后使用 define-local-member-name将其设为私有(private)。

代码如下:

(define five%
  (let ()
    (define-local-member-name internal)
    (class object%
      (super-new)
      (field [internal 5])
      (define/public (change-other other)
        (set-field! internal other 4))
      (define/public (get-number)
        internal))))

(field [internal 5])替换私有(private)字段的定义,并创建一个公共(public)变量。

然后,在类的同一作用域中,我们使用(define-local-member-nameinternal),将其转换为类作用域之外的私有(private)字段。

现在,我们可以创建两个 Five% 对象:

(define f (new five%))
(define g (new five%))

在 repl 中,我们看到 g 可以改变 f 的字段:

> (send g change-other f)
> (send f get-number)
4

但是我们不能直接改变它:

> (get-field internal f)
get-field: given object does not have the requested field
  field name: internal
  object: (object:five% ...)

感谢Asumu感谢您帮助回答这个问题。

关于class - 设置 Racket 中定义的同一类的另一个对象实例的私有(private)字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41227441/

相关文章:

javascript - 数组中的项目无法识别。 - 杰斯

class - D 中的自动字段顺序重排

Python 计数器变量在第二次运行时出错?

python - 如何在 Pygame 中的不同对象的事件中拥有多个计时器?

java - @ map 结构。源参数中不存在名为 "packaging"的属性

包含意外值的 PHP 对象属性

javascript - 在javascript类函数中调用函数?

java - 在两种不同情况下与对象引用混淆

mysql - 动态更改 MySQL 表以在 INSERT 上添加缺失的字段

Mysql 通过 append 同一行中的另一个字段文本来更新字段文本