Phương thức và cập nhật trường
Thuộc phần Lập trình hướng đối tượng trong hành trình R của Coddy. Bài học 38 trên 57.
Các phương thức nằm trong danh sách methods của setRefClass(). Bên trong một phương thức, các trường là tên thông thường, còn <<- thay đổi một trường. Trên trình chạy của Coddy, R in ra thông báo về gói codetools tùy chọn khi định nghĩa một lớp có phương thức, vì vậy hãy bọc phần định nghĩa trong suppressMessages():
Counter <- suppressMessages(setRefClass("Counter",
fields = list(count = "numeric"),
methods = list(
add = function(n = 1) {
count <<- count + n
},
report = function() paste("count is", count)
)
))
c1 <- Counter$new(count = 0)
c1$add()
c1$add(5)
print(c1$report())Đầu ra:
[1] "count is 6".self là đối tượng mà phương thức được gọi trên đó. Phương thức kết thúc bằng invisible(.self) sẽ trả về đối tượng, vì vậy bạn có thể nối các lời gọi:
Counter <- suppressMessages(setRefClass("Counter",
fields = list(count = "numeric"),
methods = list(
add = function(n = 1) {
count <<- count + n
invisible(.self)
}
)
))
c1 <- Counter$new(count = 0)
c1$add(2)$add(3)$add(4)
print(c1$count)Đầu ra:
[1] 9Phương thức khởi tạo initialize chạy bên trong $new(). initFields(...) thiết lập các trường được truyền vào; sau đó, phương thức có thể gán giá trị mặc định cho các trường còn lại. Các phương thức gọi nhau bằng tên:
Account <- suppressMessages(setRefClass("Account",
fields = list(owner = "character", balance = "numeric"),
methods = list(
initialize = function(...) {
initFields(...)
if (length(balance) == 0) balance <<- 0
invisible(.self)
},
deposit = function(x) balance <<- balance + x,
deposit_twice = function(x) {
deposit(x)
deposit(x)
}
)
))
a <- Account$new(owner = "Ada")
a$deposit_twice(10)
print(a$balance)Đầu ra:
[1] 20Bên trong một phương thức, dùng <- thông thường với tên trường sẽ tạo một biến cục bộ cùng tên và không làm thay đổi trường đó. Dùng <<- mỗi khi thay đổi một trường:
Counter <- suppressMessages(setRefClass("Counter",
fields = list(count = "numeric"),
methods = list(
broken = function() count <- count + 1,
working = function() count <<- count + 1
)
))
c1 <- Counter$new(count = 0)
c1$broken()
c1$broken()
c1$working()
print(c1$count)Đầu ra:
[1] 1Thử thách
DễHoàn thiện Reference Class Stack trong Stack.R. Lớp này lưu các phần tử trong thuộc tính items (kiểu ký tự, phần tử trên cùng nằm cuối) và có bốn phương thức:
push(x)thêmxlên trên cùng và trả vềinvisible(.self), nhờ đó bạn có thể gọi nối tiếp các lần đẩy;pop()xóa và trả về phần tử trên cùng, hoặc trả vềnothingkhi ngăn xếp trống;peek()trả về phần tử trên cùng mà không xóa nó, hoặc trả vềnothing;size()trả về số lượng phần tử.
Định nghĩa đã được bọc trong suppressMessages(). Code được cung cấp đọc các lệnh push a b, pop và peek, sau đó đẩy thêm hai phần tử bằng một lời gọi nối tiếp và in ra kích thước.
Viết code trong Stack.R. main.R chứa code đầu vào/đầu ra được cung cấp và bạn không thể chỉnh sửa tệp này.
Tự làm thử
source("Stack.R")
# Đoạn code đầu vào/đầu ra đã có sẵn: giữ nguyên
input <- suppressWarnings(readLines(file("stdin")))
s <- Stack$new()
for (cmd in input) {
if (startsWith(cmd, "push ")) {
items <- strsplit(substring(cmd, 6), " ")[[1]]
for (it in items) s$push(it)
} else if (cmd == "pop") {
cat("popped ", s$pop(), "\n", sep = "")
} else if (cmd == "peek") {
cat("top ", s$peek(), "\n", sep = "")
}
}
s$push("x")$push("y")
cat("size after two chained pushes: ", s$size(), "\n", sep = "")
Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Tất cả bài học trong Lập trình hướng đối tượng
1Kiến thức cơ bản về S3
Làm việc với tệpDanh sách với một lớpHàm khởi tạoPhương thức in ra và định dạngTrình xác thực và hàm hỗ trợÔn tập: nhiệt độ4Tính đóng gói trong R
Closure dưới dạng đối tượngMôi trường dưới dạng đối tượngHàm truy cậpBảo vệ trạng tháiÔn tập: đồng hồ tính phí đỗ xe2S3, hàm generic và phương thức
Hàm generic và UseMethodPhương thức mặc địnhPhương thức cho hàm generic cơ sởCơ bản về NextMethodÔn tập: diện tích hình5Các lớp S4
Định nghĩa lớp S4Slot và quyền truy cậpKiểm tra tính hợp lệPhương thức showÔn tập: Danh mục sản phẩm8Lớp tham chiếu
Định nghĩa lớp tham chiếuPhương thức và cập nhật trườngNgữ nghĩa sao chépKế thừa và callSuperÔn tập: hàng đợi tác vụTự luyện tập: Trình biên dịch R online