从子类调用重写的s3方法(R.oo / R.methodsS3)

时间:2011-11-28 21:15:03

标签: r r-s3

我在包R.tethodsS3中使用setMethodS3来创建S3方法。假设我有两个类,class Parentclass Child(R.oo对象)。 class Child继承自class Parent。两者都有方法MyMethod()。如何从孩子的MyMethod()调用超类MyMethod(家长的MyMethod())?我尝试了这个$ MyMethod(),但它调用了Child的MyMethod()

这是一个简化的例子:

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

2 个答案:

答案 0 :(得分:1)

您确实希望使用NextMethod()来实现此目的。如果您使用NextMethod(),我会强烈推荐使用MyMethod(child)

child$MyMethod()不兼容的事实似乎是Object类的错误。我会调查一下。我认为这个bug已经被忽视了,因为<object>$<method>()构造很少被任何人使用。 MyMethod(child)构造是标准R.我们在所有代码中使用它(> 100,000行)。诚实,我希望我从未在R.oo论文(2003)中写过child$MyMethod()

最后,虽然不是必需的,但我建议您使用CapitilizedNames的RCC约定用于方法和对象的类和nonCapitalizedNames,setMethodS3("myMethod", "Child", ...)

/亨里克 (R.methodsS3和R.oo的作者)

答案 1 :(得分:0)

您是否有理由不想使用

MyMethod(child)

而不是

child$MyMethod()