【发布时间】:2014-01-22 07:50:09
【问题描述】:
对于给定的引用类方法,如何确定它是否被继承?更一般地说,如何确定我在继承树上有多远?
例如,如果我的设置是:
A <- setRefClass("A",
methods = list(foo = function() whosMethod())
)
B <- setRefClass("B",
contains = "A",
methods = list(bar = function() whosMethod())
)
b <- B()
理想情况下,我希望 whosMethod() 给我类似的东西
> b$foo()
[1] "A" # or maybe a numeric value like: [1] 1L
> b$bar()
[1] "B" # or maybe a numeric value like: [1] 0L
请注意,这与class(.self) 明显不同,后者在上面的示例中总是返回"B"。
动机 - 自定义事件
我希望除了方法之外的其他事物具有类似继承的行为,例如自定义事件。我的方法可能是raise(someEvent),并且在实例化期间我传递事件处理程序来处理这些事件,例如
MyDatabase <- setRefClass(....)
datasourceA <- MyDatabase(....,
eventHandlers = list(
someEvent = function() message("Hello from myObj!"),
beforeInsert = function(data) {
if (!dataIsValid(data))
stop("Data is not valid!")
}
)
)
现在,如果一个子类定义了一个已经由父类定义的事件处理程序,那么我需要知道应该覆盖哪个事件处理程序。特别是,如果一个methodA() 为someEvent 注册handlerA() 和一个子类 中的methodB() 为同一事件 注册handlerB(),当尝试在methodA() 中注册handlerA() 我需要知道我在父方法中,这样如果handlerB() 已经注册,我不会覆盖它。
如果能够从子事件处理程序调用父事件处理程序也很好,例如方法可用的callSuper()。
【问题讨论】:
-
为什么要这样做?
-
@hadley - 在上面添加了我的动机。谢谢。
-
我做了一点探索,我会说这是不可能的。即使有可能,我也不认为有一个非平凡的定义可以很好地用于多重继承:你有一个继承图,而不是继承树。您是否有理由不想使用 R 中现有的条件处理机制?即adv-r.had.co.nz/Exceptions-Debugging.html#custom-signal-classes
-
@hadley,使用现有的条件处理机制意味着每次我使用我的对象时,我都必须用
withCallingHandlers(...., condA = ...., condB = ....)包装它,列出每个条件处理程序,这很烦人,我可能会忘记去做。我只想能够在实例化时定义一些集合处理程序,并且知道我的事件将始终在raise()处触发。
标签: r oop inheritance reference-class