Перевод средств
Часть раздела Object Oriented Programming путешествия по Lua на Coddy — урок 24 из 70.
Задание
ЛегкоВаш Цифровой Банк почти готов! Последняя важная функция — это возможность перевода денег между счетами. Именно здесь ваше объектно-ориентированное проектирование действительно проявляет себя — один объект счета может напрямую взаимодействовать с другим объектом счета.
Вы добавите метод :transfer(targetAccount, amount), который переводит деньги с одного счета на другой. Подумайте, что на самом деле включает в себя эта операция: это снятие средств со счета-источника с последующим внесением на целевой счет. Прелесть в том, что вы можете повторно использовать уже созданные вами методы!
Продолжайте работу над существующими файлами:
Account.lua: Добавьте метод:transfer(targetAccount, amount)в ваш класс Account. Этот метод должен попытаться снять сумму изself, и в случае успеха внести эту сумму наtargetAccount. Если снятие не удалось (недостаточно средств), перевод не должен состояться. Сохраните всю существующую функциональность (конструктор с ID, deposit, withdraw, getBalance и __tostring).main.lua: Создайте несколько счетов и продемонстрируйте переводы между ними, показывая, как меняются балансы в разных объектах счетов.
Вы получите пять входных значений:
- ID первого счета
- ID второго счета
- Начальный депозит на первый счет
- Сумма первого перевода (со счета 1 на счет 2)
- Сумма второго перевода (со счета 1 на счет 2)
В вашем основном файле создайте два счета с заданными ID (оба начинаются с баланса 0), внесите начальную сумму на первый счет, затем попытайтесь выполнить оба перевода с первого счета на второй. После каждой попытки перевода выводите данные обоих счетов (метод __tostring покажет их текущее состояние).
Например, если входные данные — 101, 102, 500, 200 и 400, вывод должен быть следующим:
Account [101]: Balance = 300
Account [102]: Balance = 200
Insufficient funds
Account [101]: Balance = 300
Account [102]: Balance = 200Первый счет начинается с 500 после депозита. Первый перевод на 200 проходит успешно, в результате чего на счету 101 остается 300, а на счету 102 становится 200. Второй перевод на 400 не удается, так как на счету 101 всего 300 — поэтому оба баланса остаются без изменений.
Попробуйте сами
-- Подключить модуль Account
local Account = require('Account')
-- Прочитать пять входных значений
local id1 = io.read()
local id2 = io.read()
local initialDeposit = tonumber(io.read())
local transfer1 = tonumber(io.read())
local transfer2 = tonumber(io.read())
-- Создать два аккаунта с идентификаторами
local account1 = Account:new(id1)
local account2 = Account:new(id2)
-- Внести начальную сумму на первый счет
account1:deposit(initialDeposit)
-- TODO: Попытаться выполнить первый перевод со счета account1 на счет account2
-- TODO: Вывести данные обоих счетов после первого перевода
-- TODO: Попытаться выполнить второй перевод со счета account1 на счет account2
-- TODO: Вывести данные обоих счетов после второго перевода
Все уроки раздела Object Oriented Programming
1Концепция 'self'
Таблицы с функциямиЯвный 'self'Синтаксис с двоеточиемТочка против двоеточияИтоги — Движущаяся точка4Проект: Цифровой банк
Настройка проектаМетод пополнения7Полиморфизм и переопределение
Переопределение методовВызов родительских методовУтиная типизацияОбщий интерфейсПроверка типаИтоги — Роли сотрудников2Паттерн прототипа класса
Концепция прототипаСвязывание через __indexКонструктор :new()Инициализация атрибутовНезависимые экземплярыИтоги — Автозавод5Перегрузка операторов в ООП
Сложение объектовВычитание объектовКонкатенация объектовСравнение объектов (<, >)Повторение — Математика кошелька8Инкапсуляция
Соглашения об именованииЗамыкания для приватностиДоступ через замыканияТаблицы только для чтенияЛогика валидацииИтоги — Защищенное хранилище11Паттерны проектирования (Lite)
Фабричные функцииТаблица SingletonПаттерн IteratorObserver (Слушатель)Итоги — Logger Factory3Состояние и поведение объектов
Переменные экземпляраГеттерыСеттерыВычисляемые свойстваФорматирование строкПроверка на равенствоПовторение — Оценка студента6Основы наследования
Настройка наследованияНаследование методовРасширение конструктораДобавление дочерних методовОбщее и уникальноеИтоги: Иерархия фигур