Call Overdiden S3 -Methode aus der Unterklasse (R.OO / R.Methodss3)
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()
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()