【发布时间】:2020-10-29 18:45:25
【问题描述】:
我有一个简单的 R6 对象生成器:
thing <- R6Class("youngThing",
private = list(
..age = 0),
active = list(
age = function(){
private$..age <- private$..age + 1
private$..age
}
)
)
这给了我一个简单的 R6 对象,其中 ..age 每次调用活动的 age 字段时都会增加 1:
a_thing <- thing$new()
a_thing$age
# [1] 1
在给定私有字段..age 的阈值的情况下,我希望a_thing 的对象类发生变化,如下所示:
class(a_thing)
# [1] "youngThing" "R6"
for(timestep in 1:10){
if(a_thing$age >5 & ! inherits(a_thing, "olderThing")){
class(a_thing) <- c("olderThing", class(a_thing))
}
}
class(a_thing)
# [1] "olderThing" "youngThing" "R6"
但是,我希望这发生在对象中。有没有办法在对象生成器中将此作为活动绑定包含在内,以便从它创建的任何对象都内置此功能?
注意。最好将阈值类添加到对象中;它不会取代现有的类。
【问题讨论】:
-
更改类似乎有点奇怪的设计选择。为什么不只是有一个可以根据需要询问的公共
is_old布尔标志? -
我希望有一些答案可以让这在技术上成为可能,但是从设计的角度考虑这意味着什么。如果您将一个对象分配给一个变量,然后调用该方法以使类发生变化,然后调用一个函数,该函数期望具有该对象的旧类。这打破了通常对对象的(不可变)类所做的一些假设,并可能在以后导致问题。
-
@AllanCameron 您好,感谢您的评论。在一个对象是一个人的情况下,我可以使用 S3 泛型方法根据对象(个体)的类别(年龄)来实现不同的方法。
-
@jayb 或者你可以有一个方法来检查年龄字段并做出相应的行为?
标签: r oop inheritance r6