2017-01-20 1 views
2

참조 클래스를 사용하고 메소드 상속과 관련된 문제로 실행되도록 패키지를 다시 고려 중입니다.참조 클래스 상속 메소드

나는 (상속) A을 포함하는 B 클래스가 있습니다. 그러나 상속 된 클래스 '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"