如果子类覆盖它,则从子类调用基类的方法

时间:2016-03-25 23:50:43

标签: r inheritance override

示例:我有一个MatrixPair类和一个NamedMatrixPair(继承自MatrixPair)。 MatrixPair$show()在其中打印两个矩阵,我希望NamedMatrixPair$show()打印一些额外的信息,然后还附加MatrixPair$show()将要打印的内容。

显然这是一个玩具的例子;我知道你可以在矩阵等中命名列,但这不是我的问题。

我是R的新手。我正在使用参考类。

在我所知道的大多数语言中,这是一种超常用的东西(例如super.show()base.show()或其他)。我不知道在R中是否甚至可以这样做。

MatrixPair <- setRefClass(
  'MatrixPair',

  fields = list(
    m1 = 'matrix', 
    m2 = 'matrix'),

  methods = list(

    initialize = function(...) {
      callSuper(...)
    },

    showX  = function() {
      cat(sprintf("2 matrices, with dimensions %s x %s:\n", nrow(m1), ncol(m1)))
      methods::show(m1)
      methods::show(m2)
    },
  )
)

NamedMatrixPair <- setRefClass(
  'NamedMatrixPair',

  contains = 'MatrixPair',

  fields = list(
    'rowName' = 'character',
    'colName' = 'character'
  ),

  methods = list(

    initialize = function(m1, m2, ...) {
      callSuper(m1 = m1, m2 = m2, ...)
    },

    show = function() {
      cat(sprintf("rows: %s ; cols: %s", rowName, colName))
      # I want to call show() for parent class MatrixPair.
      # methods::show(.self) won't do it
      # show(as(MatrixPair, .self)) - i.e. casting the derived class object to the parent class - won't do it
    }        
  )      
)

编辑:我找到了解决方案。

show = function() {
  cat(sprintf("rows: %s ; cols: %s", rowName, colName))
  callSuper()
}

0 个答案:

没有答案