В предыдущих главах были рассмотрены основные концепции объектно-ориентированного программирования. В этой главе создадим приложение, в котором на практическом примере применим большую часть этих концепций.
Вначале создадим новый проект консольного приложения по типу Console App, который назовем BankApplication:
И после этого создается стандартный пустой проект с классом Program и методом Main. Это будет главный проект приложения.
Но для хранения классов и интерфейсов нередко создаются отдельные проекты, в рамках которых все классы компилируются в файл библиотеки dll, которая затем подключается к главному проекту. Поэтому добавим в решение новый проект. Для этого нажмем правой кнопкой мыши на решение и выберем в контекстном меню Add -> New Project...:
В качестве типа нового проекта выберем шаблон Class Library и назовем новый проект BankLibrary:
После этого в решение добавляется новый проект, который по умолчанию имеет один файл Class1.cs. Он нам не нужен, поэтому удалим этот файл.
Этот проект будет содержать все классы, которые будут использоваться главным проектом.
Наше приложение будет имитировать работу банка. И прежде чем начать работу над приложением, выделим сущности, которые будем использовать, а также отношения между сущностями. Ну в частности, здесь мы можем выделить такие сущности, как сам банк, банковский счет. Счета бывают различных видов, например, счета до востребования и депозиты, соответственно будет несколько сущностей счетов.
Первым делом добавим в проект BankLibrary новый интерфейс, который будет описывать функциональность банковского счета. При проектировании интерфейса следует помнить, что если он определяет функционал без реализации, то данный функционал обязательно должен быть реализован в классах, применяющих данный интерфейс.
Итак, добавим в проект BankLibrary интерфейс IAccount, который будет иметь следующее содержание:
namespace BankLibrary { public interface IAccount { // Положить деньги на счет void Put(decimal sum); // Взять со счета decimal Withdraw(decimal sum); } }
Данный интерфейс определяем два метода для того, чтобы положить на счет или вывести средства со счета.
Для реакции на изменения состояния счеты мы будем использовать событийную модель, то есть обрабатываться различные изменения счета через события. Для этого добавим в проект BankLibrary новый файл AccountStateHandler.cs, в котором определим делегат и вспомогательный класс:
namespace BankLibrary { public delegate void AccountStateHandler(object sender, AccountEventArgs e); public class AccountEventArgs { // Сообщение public string Message { get;} // Сумма, на которую изменился счет public decimal Sum { get;} public AccountEventArgs(string _mes, decimal _sum) { Message = _mes; Sum = _sum; } } }
Делегат AccountStateHandler
будет использоваться для создания событий. А для обработки событий также определен класс AccountEventArgs
,
который определяет два свойства для чтения: сообщение о событии и сумма, на которую изменился счет.
После этого все решение будет выглядеть следующим образом:
Теперь определим основной класс приложения Account.