Вызов переопределенного метода s3 из подкласса (R.oo/R.methodsS3)
Вопрос
я использую 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()