R的公共和私人老虎机?

Kyl*_*ndt 10 oop r

在定义类时,R是否有私有与公共插槽的概念?

如果语言中没有严格的功能,是否有通用的命名方案?

Jor*_*eys 14

编辑:

为了给出一点历史记录:在setClass函数中,提供了一个选项'access'来创建所谓的'特权插槽',这些插槽只能通过随类提供的getter和setter来访问.这将允许创建私有插槽(通过不提供getter),但此功能从未实现过.目前的帮助页面?setClass内容如下:

访问和版本,包括与S-Plus的兼容性,但目前被忽略.


因此,没有私有和公共插槽,因为通过@符号可以访问每个插槽.而且我个人对此非常满意,因为它允许我使用包中包含的getter和setter来使用不易达到的对象的信息.它还允许我通过避免getter和setter创建的开销来节省大量计算.

我不知道在公共和"私人"插槽之间做出区分的任何命名约定.您可以通过在"私有"插槽前加一个点来区分自己,但这对插槽的行为方式没有影响.这也不常见,因为大多数R程序员不关心公共和私人插槽.他们只是不提供普通用户不应该访问的插槽的getter和setter.

举一个简单的例子:下面创建一个带有两个插槽的类,以及一个仅用于一个插槽的getter和setter.

setClass("Example",
  representation(
    aslot = "numeric",
    .ahiddenslot = "character"
  )
)

setGeneric("aslot", function(x) standardGeneric("aslot"))

setMethod("aslot","Example",function(x){
    x@aslot
})

setGeneric("aslot<-", function(x,value) standardGeneric("aslot<-"))

setMethod("aslot<-","Example",function(x,value){
    x@aslot <- value
    x
})
Run Code Online (Sandbox Code Playgroud)

您还可以设置一个show不打印隐藏插槽的方法:

setMethod("show","Example",function(object){
  cat("Example with value for aslot: ", object@aslot,"\n")
})
Run Code Online (Sandbox Code Playgroud)

这给出了以下正常用途:

> X <- new("Example",aslot=1,.ahiddenslot="b")
> X
Example with value for aslot:  1 
> aslot(X)
[1] 1
> aslot(X) <- 3
Run Code Online (Sandbox Code Playgroud)

但是.ahiddenslot仍然可以访问:

> slot(X,".ahiddenslot")
[1] "b"
Run Code Online (Sandbox Code Playgroud)