Вызов переопределенного метода s3 из подкласса (R.oo/R.methodsS3)

StackOverflow https://stackoverflow.com/questions/8302399

  •  25-10-2019
  •  | 
  •  

Вопрос

я использую setMethodS3 в пакете R.methodsS3 для создания метода 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()
Это было полезно?

Решение

Вы хотите использовать NextMethod() для достижения этой цели. NextMethod() будет работать, если вы используете MyMethod(child), что я настоятельно рекомендовал.

Дело в том, что это не работает с child$MyMethod() похоже, это ошибка класса Object.Я рассмотрю это.Я думаю, что эта ошибка осталась незамеченной, потому что <object>$<method>() Конструкция так редко кем-либо используется.А MyMethod(child) конструкция стандартная R.Мы используем его во всем нашем коде (>100 000 строк).Честно говоря, лучше бы я никогда не писал об этом. child$MyMethod() в статье R.oo (2003).

Наконец, хотя это и не обязательно, я рекомендую вам использовать соглашение RCC, используя CapitilizedNames для классов и неCapitalizedNames для методов и объектов. setMethodS3("myMethod", "Child", ...).

/Хенрик (автор R.Methodss3 и R.OO)

Другие советы

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

MyMethod(child)

вместо

child$MyMethod()
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top