Frage

Ich benutze setMethodS3 In Paket R.Methodss3, um eine S3 -Methode zu erstellen. Nehmen wir an, ich habe zwei Klassen, class Parent und class Child (R.OO -Objekt). class Child Erben von class Parent. Beide haben die Methode MyMethod(). Wie rufe ich Superklasse an MyMethod() (Eltern MyMethod) von Kindern MyMethod()? Ich habe diesen $ myMethod () ausprobiert, aber es nennt das Kind MyMethod()

Hier ist ein reduziertes Beispiel:

library( R.oo )

setConstructorS3( "Parent" , definition = 
function()
{
    extend( Object() , "Parent" , .stateVar1 = FALSE )
} )

setMethodS3( "MyMethod" , "Parent" , appendVarArgs = FALSE , definition = 
function( this , someParam , ... )
{
   print( this$.stateVar1 )
   print( someParam  )
} )

setConstructorS3( "Child" , definition = 
function()
{
    extend( Parent() , "Child" )
} )

setMethodS3( "MyMethod" , "Child" , appendVarArgs = FALSE , definition = 
function( this , someParam , ... )
{
   NextMethod( "MyMethod" ) # does not work
   this$MyMethod( someParam ) # also does not work
} )

child = Child()
child$MyMethod()
War es hilfreich?

Lösung

Sie möchten verwenden NextMethod() um das zu erreichen. NextMethod() Wird funktionieren, wenn Sie verwenden MyMethod(child), was ich dringend empfohlen habe.

Die Tatsache, die nicht mit dem funktioniert child$MyMethod() scheint ein Fehler der Objektklasse zu sein. Ich werde es untersuchen. Ich denke, dieser Fehler ist unbemerkt, weil die <object>$<method>() Das Konstrukt wird von irgendjemandem selten verwendet. Das MyMethod(child) Konstrukt ist Standard R. Wir verwenden es in allen unseren Code (> 100.000 Zeilen). Ehrlichkeit, ich wünschte, ich hätte nie darüber geschrieben child$MyMethod() In The R.OO Paper (2003).

Obwohl nicht erforderlich, empfehle ich, die RCC -Konvention mit Kapitilizednamen für Klassen und nicht -capitalisierteNamen für Methoden und Objekte zu verwenden. setMethodS3("myMethod", "Child", ...).

/Henrik (Autor von R.Methodss3 und R.OO)

Andere Tipps

Gibt es einen Grund, warum Sie nicht verwenden möchten

MyMethod(child)

Anstatt von

child$MyMethod()
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top