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()
È stato utile?

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()
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top