Chiamare il metodo s3 sovrascritto da sottoclasse (R.oo / R.methodsS3)
Domanda
Sto usando setMethodS3
nel pacchetto R.methodsS3 per creare un metodo di S3. Diciamo che ho due classi, class Parent
e class Child
(oggetto R.oo). eredita class Child
da class Parent
. Entrambi hanno il metodo MyMethod()
. Come chiamare in MyMethod()
superclasse (MyMethod
del genitore) da MyMethod()
del bambino? Ho provato questo $ MyMethod (), ma richiede del bambino MyMethod()
Ecco un esempio ridotta:
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()
Soluzione
si vuole utilizzare NextMethod()
per raggiungere questo obiettivo. NextMethod()
funzionerà se si utilizza MyMethod(child)
, che ho fortemente raccomandato.
Il fatto che non funziona con il child$MyMethod()
sembra essere un bug della classe Object. Cercherò in esso. Credo che questo bug è passato inosservato perché il costrutto <object>$<method>()
è così raramente utilizzato da chiunque. Il costrutto MyMethod(child)
è di serie R. L'usiamo in tutti i nostri codici (> 100.000 linee). L'onestà, vorrei che non ho mai scritto child$MyMethod()
nella carta R.oo (2003).
Infine, anche se non richiesto, vi consiglio di utilizzare la convenzione RCC utilizzando CapitilizedNames per le classi e nonCapitalizedNames per i metodi e gli oggetti, setMethodS3("myMethod", "Child", ...)
.
/ Henrik (Autore di R.methodsS3 e R.oo)
Altri suggerimenti
C'è un motivo non si desidera utilizzare
MyMethod(child)
anziché
child$MyMethod()