假设我在 Racket 中有一些名为 Five%
的类:
(define five%
(class object%
(super-new)
(define internal 5)
(define/public (get-number)
internal)))
假设我已经定义了两个五:
(define f (new five%))
(define g (new five%))
现在,f
和 g
都可以访问自己的内部
字段。但是假设我想向 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/