Menu
Coddy logo textTech

復習 - 動物園の飼育員

CoddyのRジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 36/57。

challenge icon

チャレンジ

中級

5つのファイルにわたってS4クラスの動物園を構築してください。

  • Animal.R: スロット name と kg を持つ仮想クラス Animal、ジェネリック関数 food_kg(a)、および Animal 用の show() メソッド。これは Leo the lion eats 9.5 kg(クラス名は小文字、食事量は小数第1位まで)を出力して改行します。
  • Mammal.R: Animal を含む仮想クラス Mammal。
  • 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オンラインコンパイラ