2012-05-25 11 views

risposta

14

EDIT:

Per dare un po 'di storia: Negli setClass funzione 'accesso' un'opzione è stato fornito per creare le cosiddette 'slot privilegiati' che potrebbero essere raggiunte solo attraverso getter e setter fornite con la classe . Ciò consentirebbe di creare slot privati ​​(non fornendo un getter), ma questa funzione non è mai stata implementata. La pagina di aiuto di ?setClass attualmente recita:

l'accesso e la versione, inclusi per la compatibilità con S-Plus, ma attualmente ignorato.


Quindi non v'è alcuna cosa come slot privati ​​e pubblici, come attraverso la notazione @ ogni slot è raggiungibile. E personalmente sono molto contento di questo, in quanto mi consente di utilizzare le informazioni di oggetti che non sono facilmente raggiungibili utilizzando i getter ei setter inclusi nel pacchetto. Mi consente inoltre di economizzare i calcoli pesanti evitando i costi generali creati dai getter e dai setter.

Non sono a conoscenza di alcuna convenzione di denominazione per fare una distinzione tra spazi pubblici e "privati". Puoi fare la differenza per te stesso precedendo gli slot "privati" con un punto, ma ciò non ha alcun effetto sul comportamento di tali slot. Inoltre, non è una pratica comune, poiché la maggior parte dei programmatori R non si preoccupa delle slot pubbliche e private. Semplicemente non forniscono getter e setter per slot che l'utente medio non dovrebbe raggiungere.

Per dare un esempio banale: quanto segue crea una classe con due slot e un getter e setter per un solo slot.

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 
}) 

È anche possibile impostare un metodo show che proprio non stampare la fessura nascosta:

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

Questo dà il seguente uso normale:

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

Ma la .ahiddenslot è ancora raggiungibile:

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

T lui nomina convenzione di un "." ha senso, in quanto penso che per lo più mi aiuterà a mantenere le cose dritte in base alle mie intenzioni facendo la distinzione. Non mi interessa davvero se sono protetti. –

Problemi correlati