回顾:动物园管理员
本课属于 Coddy R 学习旅程的“面向对象编程”单元。第 36 课,共 57 课。
挑战
中等在 5 个文件中构建一个由 S4 类组成的动物园。
Animal.R:虚拟类Animal,包含属性name和kg、泛型food_kg(a),以及一个属于Animal的show()方法,该方法会打印Leo the lion eats 9.5 kg(类名为小写,食物重量保留 1 位小数),并换行。Mammal.R:虚拟类Mammal,其中包含Animal。Lion.R和Elephant.R:哺乳动物,分别吃相当于自身体重 5% 和 4% 的食物。Parrot.R:一种动物(不是哺乳动物),带有额外属性word,每天吃 0.1 kg;它的show()方法会打印动物信息行,然后通过callNextMethod()打印Polly says hello。
提供的代码会读取以下行:lion Leo 190、elephant Ella 4000 或 parrot Polly 1 hello,然后打印每只动物、食物总量、哺乳动物的数量,以及 Animal 是否为虚拟类。
你的代码应写在 Animal.R、Mammal.R、Lion.R、Elephant.R 和 Parrot.R 中。main.R 存放提供的输入/输出代码,不能编辑。
亲手试试
source("Animal.R")
source("Mammal.R")
source("Lion.R")
source("Elephant.R")
source("Parrot.R")
# 提供的输入和输出代码:保持原样。
input <- suppressWarnings(readLines(file("stdin")))
zoo <- list()
for (line in input) {
p <- strsplit(line, " ")[[1]]
kg <- as.numeric(p[3])
a <- switch(p[1],
lion = new("Lion", name = p[2], kg = kg),
elephant = new("Elephant", name = p[2], kg = kg),
parrot = new("Parrot", name = p[2], kg = kg, word = p[4]))
zoo[[length(zoo) + 1]] <- a
print(a)
}
cat(sprintf("food per day: %.1f kg", sum(vapply(zoo, food_kg, numeric(1)))), "\n", sep = "")
cat("mammals: ", sum(vapply(zoo, is, logical(1), "Mammal")), "\n", sep = "")
cat("Animal is virtual: ", isVirtualClass("Animal"), "\n", sep = "")
面向对象编程中的所有课
自己练习: R 在线编译器