2017-01-20 12 views
2

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

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

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

Это самодостаточный пример для демонстрации вопроса:

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" 

ответ

3

Я думаю, что это только вопрос порядка: 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"