2017-01-20 141 views
2

我正在重新包裝一個包以使用引用類並遇到方法繼承的問題。引用類繼承方法

我有一個類,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" 

回答

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"