Menu
CoddyTech

Ôn tập: Phương thức thanh toán

Thuộc phần Lập trình hướng đối tượng trong hành trình Kotlin của Coddy. Bài học 26 trên 57.

challenge icon

Thử thách

Trung bình

Thiết kế các phương thức thanh toán dựa trên một giao diện.

  • PaymentMethod yêu cầu name, fee(amount), pay(amount) (trả về liệu đã thanh toán hay chưa) và status(), đồng thời cung cấp total(amount) mặc định: số tiền cộng với phí.
  • Card (tên card) tính phí 2% (làm tròn xuống), luôn thanh toán và đếm số lần thanh toán: card: 2 payment(s).
  • Wallet(balance) (tên wallet) không tính phí và chỉ thanh toán khi số dư đủ trả tổng số tiền, sau đó trừ khoản tiền đó khỏi số dư: wallet: 50 left.
  • GiftCard(balance) (tên gift card) cũng không tính phí, nhưng chỉ thanh toán các khoản không quá 100 và chỉ khi số dư đủ trả các khoản đó: gift card: 40 left.

Sau đó, hãy hoàn thiện checkout(amount, methods), hàm này lần lượt thử từng PaymentMethod và trả về paid 100 with wallet (total 100) cho phương thức đầu tiên thanh toán thành công, hoặc declined nếu không có phương thức nào thanh toán.

Code được cung cấp đọc các phương thức theo dạng card,wallet:150,gift:120, sau đó đọc mỗi dòng một số tiền, in ra kết quả của từng lần thanh toán và cuối cùng in trạng thái status() của mọi phương thức.

Code của bạn nằm trong PaymentMethod.kt, Card.kt, Wallet.kt, GiftCard.kt và Functions.kt. Main.kt 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ử

fun main() {
    // Đoạn code đầu vào/đầu ra đã được cung cấp: giữ nguyên
    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())
}

Tất cả bài học trong Lập trình hướng đối tượng

Tự luyện tập: Playground Kotlin