Вызовите переопределенный метод s3 из подкласса (R.oo / R.methodsS3) - PullRequest
2 голосов
/ 29 ноября 2011

Я использую setMethodS3 в пакете R.methodsS3 для создания метода S3.Допустим, у меня есть два класса, class Parent и class Child (объект R.oo).class Child наследуется от class Parent.У обоих есть метод MyMethod().Как мне назвать суперкласс MyMethod() (родительский MyMethod) из детского MyMethod()?Я пробовал этот $ MyMethod (), но он вызывает Child's 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 ]

1 голос
/ 29 ноября 2011

Вы хотите использовать 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)

0 голосов
/ 29 ноября 2011

По какой причине вы не хотите использовать

MyMethod(child)

вместо

child$MyMethod()
...