【问题标题】:Call overridden s3 method from subclass (R.oo / R.methodsS3)从子类调用重写的 s3 方法 (R.oo / R.methodsS3)
【发布时间】:2011-11-28 21:15:03
【问题描述】:

我在包 R.methodsS3 中使用 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()

【问题讨论】:

  • 感谢 Henrik 提供了我们在电子邮件中讨论的解决方法:MyMethod.Parent(this, someParam)

标签: r r-s3


【解决方案1】:

您确实想使用NextMethod() 来实现此目的。如果您使用MyMethod(child)NextMethod() 将起作用,我强烈推荐。

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

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

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

【讨论】:

  • Henrik - 我很惊讶 $() 很少使用;对于具有 OO 背景的用户来说,它似乎更直观。很高兴看到一个错误修复。我所有的代码都是 object$method 格式的,改变它会产生很大的影响。我想还有其他人采用了这种约定,但没有调用超类方法。在创建没有超类/子类的对象的基本情况下,R.oo 仍然提供了巨大的生产力收益。我敢打赌,其他人仅将 R.oo 用于原子对象。 $() 小于 method(object) 似乎不对。只是我的意见
  • ...顺便说一句,我认为您的 R 风格/编码约定指南很棒!我写了自己的,因为我对 Google 的指导方针不满意,然后我偶然发现了你的指导方针,看到我们在大多数主题上达成一致,我松了一口气。方法的 camelCase 从未与我达成一致,特别是因为它不是我编码的其他语言中的约定。我使用 camelCase 作为参数名称,因此 myMethod( myParam ) 在视觉上无法将方法与参数区分开来,足以满足我的口味。
【解决方案2】:

你有不想用的理由吗

MyMethod(child)

而不是

child$MyMethod()

【讨论】:

  • 嗨 Max - 不确定两者之间的区别如何解决在超类中调用重载方法的问题?我使用 child$MyMethod() 是因为它更接近于其他面向对象的语言,而且我发现它更具可读性。
猜你喜欢
  • 2017-07-07
  • 2012-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多