2017-01-20 10 views
2

参照クラスを使用し、メソッドの継承に関する問題に取り組むように、パッケージを再組み立てしています。参照クラス継承メソッド

私には、というクラスがあり、それには(継承)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)を定義した後に実行されます実行順序の簡単な変更により、次のことが可能になります。

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"