R Reference Class多重继承:如何在特定的父类中调用方法?

时间:2015-02-06 14:10:02

标签: r oop inheritance multiple-inheritance reference-class

我有一个继承自ChildSuperA的引用类SuperB。在initialize的{​​{1}}方法中,我想依次调用Childinitialize的{​​{1}}方法。

因此,例如,我有:

SuperA

但我得到的只是:

SuperB

那么有没有人对如何调用属于特定父级的方法有任何想法?

1 个答案:

答案 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