Методы наследования ссылочного класса

Я реорганизую пакет для использования эталонных классов и столкнулся с проблемой наследования методов.

У меня есть класс B, который содержит (наследует) A. Однако я не могу вызвать ни один из методов для унаследованного экземпляра класса «B». На самом деле они даже не существуют в объекте.

Как определить ссылочный класс, который наследует методы другого класса? Имеет ли значение, что унаследованные методы являются универсальными?

Это автономный пример, демонстрирующий проблему:

A <- setRefClass("A", fields=c("f1", "f2"))

B <- setRefClass("B", fields=c("f3"), contains="A")

setGeneric("f", function(.self) standardGeneric("f"))

setMethod(f,
  signature = c(.self="A"),
  definition = function(.self) {
    print("Hello from class A")
  }
)

setMethod(f, signature = c(.self="B"),
  definition = function(.self) {
    print("Hello from class B")
  }
)

A$methods(f=f)

a <- A$new()
b <- B$new()

Вызов методов:

> a$f()
[1] "Hello from class A"

> b$f()
Error in envRefInferField(x, what, getClass(class(x)), selfEnv) : 
  ‘f’ is not a valid field or method name for reference class “B”

# Should print "Hello from class B"

person Zelazny7    schedule 20.01.2017    source источник


Ответы (1)


Я думаю, что это просто вопрос порядка: A$methods(f=f) выполняется после определения класса B. Помогает простая модификация порядка выполнения:

A <- setRefClass("A", fields=c("f1", "f2"))
setGeneric("f", function(.self) standardGeneric("f"))
setMethod(f,
          signature = c(.self="A"),
          definition = function(.self) {
            print("Hello from class A")
          }
)

A$methods(f=f)

B <- setRefClass("B", fields=c("f3"), contains="A")
setMethod(f, signature = c(.self="B"),
          definition = function(.self) {
            print("Hello from class B")
          }
)

a <- A$new()
b <- B$new()

a$f()
#[1] "Hello from class A"
b$f()
#[1] "Hello from class B"
person echasnovski    schedule 20.01.2017