2

我正在使用setMethodS3包 R.methodsS3 来创建 S3 方法。假设我有两个类,class Parentclass Child(R.oo 对象)。 class Child继承自class Parent。两者都有方法MyMethod()。如何从 Child's调用超类MyMethod()(Parent's ) ?我试过这个$MyMethod(),但它调用了Child'sMyMethodMyMethod()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()
4

2 回答 2

1

你确实想用它NextMethod()来实现这一点。 NextMethod()如果您使用MyMethod(child),我强烈建议您使用它。

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

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

/Henrik(R.methodsS3 和 R.oo 的作者)

于 2011-11-29T19:54:18.900 回答
0

有你不想使用的理由吗

MyMethod(child)

代替

child$MyMethod()
于 2011-11-29T02:45:33.310 回答