我在包R.tethodsS3中使用setMethodS3
来创建S3方法。假设我有两个类,class Parent
和class 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()
答案 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()