Часто в проектировании программ нам удобно опираться на понятия, которые не представлены в реальном мире, но служат удобной "опорой" для объединения нескольких классов.
Так, например, в банковском деле нет абстрактного понятия "Счет". Каждый счет в банке имеет четкое назначение: сберегательный, кредитный, расчетный. Но банковская программа работает с общими для счетов операциями как с одинаковыми объектами, и выполняет их, обращаясь к общему типу "Счет", хотя его и невозможно явно инстанцировать в программе. Реализуйте этот сценарий, опираясь на механизмы полиморфизма.
- Создайте несколько классов — различных счетов на основе общего интерфейса:
- Сберегательный счет (
SavingsAccount
) - Кредитный счет (
CreditAccount
) - Расчетный счет (
CheckingAccount
)
- Выполните перевод с одного счета на другой в методе
public static void main
.
- Создайте абстрактный класс
Account
с тремя методами: заплатить, перевести, пополнить (pay(int amount)
,transfer(Account account, int amount)
,addMoney(int amount)
). Платеж в нашем случае будет выглядеть просто как списание средств. - Добавьте классы Сберегательный, Кредитный, Расчетный (
SavingsAccount
,CreditAccount
,CheckingAccount
соответственно) как потомков класса Счет. В них нужно переопределить методы базового класса. Каждый из них должен хранить баланс. Со сберегательного счета нельзя платить, только переводить и пополнять. Также сберегательный не может уходить в минус. Кредитный не может иметь положительный баланс – если платить с него, то уходит в минус, чтобы вернуть в 0, надо пополнить его. Расчетный может выполнять все три операции, но не может уходить в минус. - Продемонстрируйте работу счетов. Создайте три переменные типа
Account
и присвойте им три разных типа счетов.