|
Программирование >> Аргументация конструирования
Введите номер счета: 123 Введите ительную сумму для вклада, отрицательную для снятия, 0 для прекращения работы :200 :-20 Нажмите S дл мтельных счетов, С для чековых, X дл ода: s Введите номер счета: 234 Введите тельную сумму для вклада, отрицательную для снятия, 0 для прекращения работы :200 :-10 :-10 Нажмите S дл мтельных счетов, С для чековых, X дл ода: с Введите номер счета: 345 Введите тательную сумму для вклада, отрицательную для снятия, 0 для прекращения работы :200 :-20 Нажмите S дл тельных счетов, С для чековых, X дл тода: С Введите номер счета: 456 Введите положительную сумму для вклада, отрицательную для снятия, 0 для прекращения работы :600 :-20 Нажмите S для сберегательных счетов, С для чековых, X для выхода: х Суммы по всем счетам: Сберегательный счет номер 123 - 180 Сберегательный счет номер 234 = 175 Чековый счет номер 345 = 179.8 Чековый счет номер 456 = 580 Всего = 1114.8 Объектцо-ориецтироваццая црограмма Budgets цачицается с базового класса LinkedListObject. Этот класс содержит члены, необходимые для создания связанного списка. Здесь есть указатели на первый и следующий объекты в связанном списке, а также открытые фуцкции-члецы first() и next (). Любой класс, цолучеццый из LinkedListObject, может быть использован для создания связанного списка, поскольку он наследует все необходимые функции-члены. Следующий класс, содержащийся в программе Budget3, - это класс Account. Он обобщает в себе все, что можно сказать о счетах, а именно: £< они распознаются по номерам; S каждый счет имеет баланс; i пользователь может вкладывать или снимать деньги со счета. Нам известно, как выполнять вложение денег на счет, поэтому функция deposit {) определена прямо в классе Account. Однако мы не знаем, как в общем виде выполнить снятие денег, поскольку для разных типов счетов эта операция различна. Поэтому функция Account:.: withdrawal () объявлена чисто виртуальной (с помошью = о в конце объявления). Конструктор класса Account начинается с автоматического вызова конструктора LinkedListObject, который добавляет текущий счет к концу связанного списка объектов Account. Затем конструктор Account создает уникальную для каждого счета информацию, записывая номер счета и начальный баланс (который приравнивается нулю, если при создании счета не б]л задан другой баланс). Затем увеличивается на единицу значение статического члена count, с помощью которого отслеживается количество существующих в данный момент объектов Account. -С, Для одного класса существует только одна копия каждого статического объекта. К ней имеют доступ все объекты класса. Функции ntNo О Balance (} служат для того, чтобы предоставлять возможность считывания номера счета и информации о балансе из внешнего мира, но не допускать непосредственного изменения этих значений. Фупкции-чдепы Account:: first(; и next () переопределяют свои более ранние версии из класса LinkedListObject. Без этих па первый взгляд бессмысленных функций пользователь должен был бы сам приводить тип объектов LinkedListObject, которые возвращают функции first() и next (), к тину Account. Функции display О и type() придают всем счетам одинаковый формат отображения. Подкласс checking класса Account достаточно прост. Конструктор класса Checking не делает ничего, кроме передачи аргументов конструктору класса Account. Единственная настоящая функция-член в этом классе - это withdrawal О , которая реализует правила работы с чековыми счетами. Класс Savings идентичен в этом классу Checking: все, что он делает, - это реализует метод withdrawal (). Любой подкласс класса Account, который не переопределяет функцию withdrawal (), будет виртуальным, и вы не сможете создать объект этого класса. составляющие главную программу, теперь упрощены до предела. Функция get Account о создает счет класса Checking или Savings (в зависимости от символа, введенного пользователем). Это единственное место в программе, где происходит непосредственное обращение к подклассам класса Account. Функция displayResult () просматривает связанный список, требуя от каждого объекта отобразить свое содержимое, не интересуясь при этом деталями того, как именно сберегательные или чековые счета (или любые другие) будут это выполнять. функция process!) имеет еще более впечатляющий вид. Она выполняет вложения (которые обрабатывает функция Account: :deposit()) и снятия (которые обрабатывают функции savings::withdrawal О и Checking::withdrawal(), в зависимости от типа объекта, на который указывает pAccount). Обратите внимание на то, какой привлекательной теперь стала функция process (). Во-первых, полностью исчезла избыточность, которая появлялась благодаря существованию разных версий этой функции. Более важно то, что логика функции process!) значительно упростилась. Теперь программист может сконцентрироваться на работе этой функции, не волнуясь о внутренних особенностях разнхх типов счетов. Задача, которую решает Budget3, довольно проста. Но сравнение разнхх версий программы Budget позволит понять отличия между чисто фуньщиональной программой (Budgetl) и ее развитием - через объектно-основанную программу без иаследованил (Budget2) в полностью объектно-ориентированную программу (Budgets).
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |