2012-05-25 12 views

Respuesta

14

EDIT:

para dar un poco de historia: En los setClass funcionan 'acceso' una opción se proporciona para crear los llamados 'espacios privilegiados' que sólo se podía acceder a través de captadores y definidores proporcionadas con la clase . Esto permitiría crear espacios privados (al no proporcionar un getter), pero esta característica nunca se implementó. La página de ayuda de ?setClass lee actualmente:

el acceso y la versión, incluyen la compatibilidad con S-Plus, pero actualmente ignorado.


lo que no hay tal cosa como ranuras privadas y públicas, como a través de la notación @ cada ranura es alcanzable. Y personalmente estoy muy contento con eso, ya que me permite usar información de objetos que no se puede alcanzar fácilmente mediante el uso de getters y setters incluidos en el paquete. También me permite economizar cálculos pesados ​​evitando gastos generales creados por getters y setters.

No conozco ninguna convención de nomenclatura para hacer una distinción entre ranuras públicas y "privadas". Puede hacer la distinción por sí mismo precediendo las ranuras "privadas" con un punto, pero eso no tiene ningún efecto sobre cómo se comportan esas ranuras. Tampoco es una práctica común, ya que la mayoría de los programadores R no se preocupan por los espacios públicos y privados. Simplemente no proporcionan getters y setters para slots que el usuario promedio no debería alcanzar.

Para dar un ejemplo trivial: lo siguiente crea una clase con dos ranuras, y un getter y setter para una sola ranura.

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

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

setMethod("aslot","Example",function(x){ 
    [email protected] 
}) 

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

setMethod("aslot<-","Example",function(x,value){ 
    [email protected] <- value 
    x 
}) 

También puede establecer un método show que simplemente no se imprima la ranura oculta:

setMethod("show","Example",function(object){ 
    cat("Example with value for aslot: ", [email protected],"\n") 
}) 

Esto da la siguiente uso normal:

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

Pero el .ahiddenslot todavía es alcanzable:

> slot(X,".ahiddenslot") 
[1] "b" 
+1

T el nombre de la convención de un "." tiene sentido, ya que en general creo que me ayudará a mantener las cosas claras en términos de mi intención al hacer la distinción. Realmente no me importa si están protegidos. –

Cuestiones relacionadas