مراجعة - أساليب الدفع
جزء من قسم البرمجة كائنية التوجه في رحلة Kotlin على Coddy. الدرس 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، ثم يقرأ مبلغًا واحدًا في كل سطر، ويطبع نتيجة كل عملية دفع، وأخيرًا حالة كل طريقة عبر 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())
}
جميع دروس البرمجة كائنية التوجه
1الفئات والكائنات
العمل مع الملفاتتعريف الفئاتالمنشئات الأساسيةكتل init والتحقق من الصحةالمنشئات الثانويةمراجعة - بطاقة المكتبة4الوراثة
الأصناف المفتوحة والأصناف الفرعيةتجاوز الأعضاءsuper والمنشئاتالأصناف المجرّدةمراجعة - دليل الموظفينتدرّب بنفسك: Playground لـ Kotlin