我有一个继承自Child
和SuperA
的引用类SuperB
。在initialize
的{{1}}方法中,我想依次调用Child
和initialize
的{{1}}方法。
因此,例如,我有:
SuperA
但我得到的只是:
SuperB
那么有没有人对如何调用属于特定父级的方法有任何想法?
答案 0 :(得分:3)
我不是一个繁重的引用类用户,但在S4(引用类所基于的)上,最好的方法通常是避免定义初始化方法(它有一个复杂的契约,'初始化'和'复制'命名和未命名的参数),将setClass()
返回的构造函数视为仅供内部使用,并提供面向用户的构造函数。因此
.SuperA <- setRefClass("SuperA", fields = list(a = "ANY"))
.SuperB <- setRefClass("SuperB", fields = list(b = "ANY"))
.Child <- setRefClass("Child", contains = c("SuperA", "SuperB"))
Child <- function(a, b)
## any coercion, then...
.Child(a=a, b=b)
结果是
> Child(a=1, b=2)
Reference class object of class "Child"
Field "b":
[1] 2
Field "a":
[1] 1
从?ReferenceClasses
开始,方法$export(Class)
将对象强制转换为'Class'的实例,所以
.SuperA <- setRefClass("SuperA", fields = list(a = "ANY"),
methods=list(foo=function() .self$a))
.SuperB <- setRefClass("SuperB", fields = list(b = "ANY"),
methods=list(foo=function() .self$b))
.Child <- setRefClass("Child", contains = c("SuperA", "SuperB"),
methods=list(foo=function() {
c(export("SuperA")$foo(), export("SuperB")$foo())
}))
Child <- function(a, b)
.Child(a=a, b=b)
导致
> Child(a=1, b=2)$foo()
[1] 1 2