
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
这一期昆明达内培训导师跟大家分享,基于R6的面向对象编程中的R6对象的创建与访问和设置私有域,这次的知识分享,导师个人认为还是比较重要的,他在我们之后学习R6面向对象编程有帮助的,好了,首先我们来看看:R6对象的创建。
1、R6对象的创建
首先使用 R6Class() 创建一个class generator(也可叫factory)。
第一个参数是创建的对象的类的名字。
参数private为一个list,为对象保存数据域(data field),包含每个元素的名字。
参数pubilc为一个list,为对象保存面向用户的函数或功能。
library(R6)<br>thing_factory <- R6Class(
"Thing",
private = list(
a_field = "a value",
another_field = 123
),
public = list(
do_something = function(x, y, z) {
# Do something here
}
)
)
创建factory后,再调用new()来生成一个R6对象。new()无需定义,所有的factory都默认具有该方法。
a_thing <- thing_factory$new()
initialize()是一种特殊的公有方法(public method), 在R6对象创建时自动调用,用来设置私域(private field)值。
new()中的参数被传给initialize()。
# Add an initialize method
microwave_oven_factory <- R6Class(
"MicrowaveOven",
private = list(
power_rating_watts = 800,
door_is_open = FALSE
),
public = list(
cook = function(time_seconds) {
Sys.sleep(time_seconds)
print("Your food is cooked!")
},
open_door = function() {
private$door_is_open = TRUE
},
close_door = function() {
private$door_is_open = FALSE
},
# Add initialize() method here
initialize = function(power_rating_watts,door_is_open){
if(!missing(power_rating_watts)){
private$power_rating_watts<-power_rating_watts
}
if(!missing(door_is_open)){
private$door_is_open<-door_is_open
}
}
)
)
# Make a microwave
a_microwave_oven <- microwave_oven_factory$new(
power_rating_watts = 650,
door_is_open = TRUE
)
访问和设置私有域
private组件中的数据对用户隐藏,这是封装的原理。使用private$前缀可以访问私域(private field)。
存在active组件中的active binding(行为像变量的函数),可以获取和设置私有数据域。
Active bindings是R6中一种特殊的函数调用方式,把对函数的访问表现为对属性的访问,属于公有组件。
thing_factory <- R6Class(
"Thing",
private = list(
..a_field = "a value"
),
active = list(
a_field = function(value) {
if(missing(value)) {
private$..a_field
} else {
assert_is_a_string(value) # or another assertion
private$..a_field <- value
}
}
)
)
将active binding作为数据变量而不是函数进行调用。
a_thing <- thing_factory$new()
a_thing$a_field # not a_thing$a_field()
好了关于R6对象的创建与访问和设置私有域的知识,导师就跟大家分享到这了,如果你对导师的内容感兴趣,可以随时关注达内培训学校!http://km.tedu.cn