復習 - 支払い方法
CoddyのKotlinジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 26/57。
チャレンジ
中級インターフェースを中心に支払い方法を設計します。
PaymentMethodは、name、fee(amount)、pay(amount)(支払いに成功したかどうかを返す)、status()を必須とし、金額に手数料を加えたデフォルトのtotal(amount)を提供します。Card(名前はcard)は2%の手数料(切り捨て)を請求し、常に支払いを行い、支払い回数を数えます:card: 2 payment(s)。Wallet(balance)(名前はwallet)には手数料がなく、残高が合計額をカバーする場合にのみ支払い、その後、合計額を残高から差し引きます:wallet: 50 left。GiftCard(balance)(名前はgift card)にも手数料はありませんが、100以下の金額の場合に限り、かつ残高がその金額をカバーするときにのみ支払います:gift card: 40 left。
次に checkout(amount, methods) を完成させます。この関数は各 PaymentMethod を順番に試し、最初に支払いを行ったものについて paid 100 with wallet (total 100) を返します。どれも支払えない場合は declined を返します。
提供されたコードは、card,wallet:150,gift:120 のように支払い方法を読み込み、その後は1行につき1つの金額を読み取り、各 checkout の結果を出力し、最後にすべての支払い方法の status() を出力します。
コードは PaymentMethod.kt、Card.kt、Wallet.kt、GiftCard.kt、Functions.kt に記述します。Main.kt には提供された入出力コードが含まれており、編集できません。
自分で試してみよう
fun main() {
// 提供された入出力コード: そのままにしておく
val input = generateSequence(::readLine).toList()
val methods = input[0].split(",").map { spec ->
val p = spec.split(":")
when (p[0]) {
"card" -> Card()
"wallet" -> Wallet(p[1].toInt())
else -> GiftCard(p[1].toInt())
}
}
for (line in input.drop(1)) println(checkout(line.toInt(), methods))
for (m in methods) println(m.status())
}
オブジェクト指向プログラミングのすべてのレッスン
自分で練習してみよう: Kotlinプレイグラウンド