Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

مراجعة - أساليب الدفع

جزء من قسم البرمجة كائنية التوجه في رحلة Kotlin على Coddy. الدرس 26 من 57.

challenge icon

التحدي

متوسط

صمّم طرق الدفع اعتمادًا على واجهة.

  • تتطلب 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، ثم يقرأ مبلغًا واحدًا في كل سطر، ويطبع نتيجة كل عملية دفع، وأخيرًا حالة كل طريقة عبر 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())
}

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: Playground لـ Kotlin