Повторение — способы оплаты
Часть раздела Объектно-ориентированное программирование путешествия по 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 и конструкторыАбстрактные классыПовторение — каталог сотрудников7Специальные классы
Классы данныхКлассы перечисленийЗапечатанные иерархииequals, hashCode, toStringПовторение — трекер заказов10Паттерны проектирования. Часть 2
Делегирование с помощью byПаттерн декораторПаттерн строительПаттерн состояние2Свойства и инкапсуляция
Пользовательские аксессорыМодификаторы видимостиПриватные сеттерыlazy и lateinitПовторение — банковский счёт5Интерфейсы
Объявление интерфейсовМетоды по умолчаниюМножественные интерфейсыИнтерфейсы как типыПовторение — способы оплаты8Обобщения
Обобщённые функцииОбобщённые классыОграничения типовВариативность с in и outПовторение — очередь с приоритетом11Проект: Управление библиотекой
Книги и читателиВыдача книг3Объекты и компаньоны
Объявления объектовОбъекты-компаньоныКонстанты с constОбъектные выраженияПовторение — билетная касса6Полиморфизм
Динамическая диспетчеризацияПроверка типов и умные приведения типовwhen с типамиФункции-расширенияПовторение — смотритель зоопарка9Паттерны проектирования. Часть 1
Паттерн «Одиночка»Фабричный паттернПаттерн «Наблюдатель»Паттерн «Стратегия»Потренируйтесь самостоятельно: Песочница Kotlin