復習 - 動物園の飼育員
CoddyのKotlinジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 31/57。
チャレンジ
中級動物園での一日を計画しましょう。
Animal(name, kg)は、抽象メンバーspecies、food、dailyGrams()と、Leo the lion: 5700 g meatを返すメソッドline()を持つ抽象クラスです。Lionは肉を、1 kgあたり30 g食べます。Parrotは種を、体重にかかわらず1日50 g食べます。Sealは魚を、1 kgあたり40 g食べます。- インターフェース
Trainableはtrick()を持ちます。オウム(Polly says hello)とアザラシ(Sammy balances a ball)は訓練可能ですが、ライオンは訓練できません。 - 拡張
List<Animal>.foodTotals()は、食べ物ごとのグラム数を、食べ物をアルファベット順に並べて返します。例:fish 4000, meat 5700。 showLineup(animals)は、型チェックを使用して、訓練可能な動物の芸を順番どおりに返します。該当する動物がいない場合はno showを返します。
提供されたコードは、lion,Leo,190、parrot,Polly,1、またはseal,Sammy,100の行を読み込み、すべてのline()を出力します。その後、合計値を伴うfood: と、返された芸ごとに1行のshow: を出力します。
コードはAnimal.kt、Trainable.kt、Lion.kt、Parrot.kt、Seal.kt、Functions.ktに記述します。Main.ktには提供された入出力コードが含まれており、編集できません。
自分で試してみよう
fun main() {
// 提供された入出力コード: そのままにしておく
val input = generateSequence(::readLine).toList()
val animals = input.map { line ->
val (kind, name, kg) = line.split(",")
when (kind) {
"lion" -> Lion(name, kg.toInt())
"parrot" -> Parrot(name, kg.toInt())
else -> Seal(name, kg.toInt())
}
}
for (a in animals) println(a.line())
println("food: " + animals.foodTotals())
for (s in showLineup(animals)) println("show: $s")
}
オブジェクト指向プログラミングのすべてのレッスン
自分で練習してみよう: Kotlinプレイグラウンド