2012-05-25 16 views

Antwort

14

EDIT:

ein bisschen Geschichte zu geben: In der setClass einer Option ‚Zugangs‘ Funktion zur Verfügung gestellt wurde, so genannte ‚privilegierte Slots‘ zu erstellen, die nur durch Getter und Setter, der mit der Klasse zugegriffen werden konnte . Dies würde ermöglichen, private Slots zu erstellen (indem kein Getter bereitgestellt wird), aber diese Funktion wurde nie implementiert. Die Hilfeseite von ?setClass zur Zeit liest:

Zugang und die Version, für die Kompatibilität mit S-Plus enthalten, aber derzeit ignoriert.


So ist es nicht so etwas wie private und öffentliche Slots, wie durch die @ Notation jeder Schlitz erreichbar ist. Und persönlich bin ich sehr zufrieden damit, dass ich Informationen von Objekten verwenden kann, die nicht einfach erreichbar sind, indem ich die Getter und Setter benutze, die im Paket enthalten sind. Es erlaubt mir auch, schwere Berechnungen zu sparen, indem ich Overhead vermeidet, der von Getter und Setter erzeugt wird.

Mir ist keine Namenskonvention zur Unterscheidung zwischen öffentlichen und "privaten" Slots bekannt. Sie können die Unterscheidung für sich selbst treffen, indem Sie den "privaten" Slots einen Punkt voranstellen, aber das hat keinen Einfluss darauf, wie sich diese Slots verhalten. Es ist auch nicht üblich, da die meisten R-Programmierer sich nicht um öffentliche und private Slots kümmern. Sie bieten nur keine Getter und Setter für Slots, die der durchschnittliche Benutzer nicht erreichen sollte.

Um ein triviales Beispiel zu geben: Im Folgenden wird eine Klasse mit zwei Slots und ein Getter und Setter für nur einen Slot erstellt.

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

Sie können auch festlegen, eine show Methode, die einfach nicht die versteckten Schlitz nicht ausdrucken:

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

Dies ergibt die folgenden normalen Gebrauch:

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

Aber die .ahiddenslot ist immer noch erreichbar:

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

T Die Namenskonvention eines "." macht Sinn, denn meistens denke ich, dass es mir helfen wird, die Dinge in Bezug auf meine Absicht klarzustellen, indem ich die Unterscheidung treffe. Es ist mir egal, ob sie geschützt sind. –

Verwandte Themen