end % methods
end % classdef
Implementing the AccountManager Class (Исполнение класса AccountManager)
Служебный класс AccountManager обеспечивает два метода. Один из них создает и регистрирует слушателя события InsufficientFunds и его callback-функцию, другой раскрывает эту функцию. В этом классе нет определений конструктора (не создаются объекты) и событий (даются только для handle-классов), поэтому он может не быть handle-классом:
classdef AccountManager % В этом определении нет указания на
% суперкласс handle или его подкласс.
methods (Static) % Статический метод - определен только для
% класса, но не для его конкретных объект-инстанций.
function assignStatus(src,evnt) % callback-функция;
% src – источник события, evnt – данные о событии
% (здесь не используются). Если счет отрицательный:
if src.AccountBalance < 0
% и перерасход больше 200:
if src.AccountBalance < -200
% то счет следует закрыть:
src.AccountStatus = 'closed';
else% Если первое условие выполняется, а второе - нет,
% счет просто перерасходован, но порог не
% превышен:
src.AccountStatus = 'overdrawn';
end
end
end
function addAccount(BA) % Функция-метод создания и
% регистрации слушателя и его callback-функции путем
% вызова метода addlistener, определенного в суперклассе
% handle (объект BA наследует метод addlistener, так
% как выведен из класса BankAccount, являющегося подклассом
% суперкласса handle):
addlistener(BA, 'InsufficientFunds',...
@(src,evnt)AccountManager...
.assignStatus(src,evnt)); % Источник src
% события и данные evnt о событии
% автоматически задаются с помощью системы MATLAB;
% @ - указатель на анонимную функцию, содержащую
% callback-функцию assignStatus.
end % addAccount.
end % methods.
end % classdef.
Заметьте, что класс AccountManager никогда не имеет инстанций (своих объектов). Он действует лишь как интерфейс для всех слушателей объектов класса BankAccount. Данные evnt в последнем коде можно опустить.
UsingtheBankAccountClass (Использование класса BankAccount)
Класс BankAccount, хотя и является простым классом, демонстрирует общее поведение MATLAB-классов. Например, создадим BankAccount-объект с очередным номером 1234567 и начальным депозитом $500; для этого наберем в командном окне:
BA = BankAccount(1234567,500);
В соответствии с этим выражением MATLAB вызовет функцию BankAccount, которая, будучи найденной, окажется конструктор-методом BankAccount(AccountNumber, InitialBalance) BankAccount-объекта, куда поступят фактические числа 1234567, 500 на место соответствующих входных аргументов AccountNumber и InitialBalance. По ним далее будут установлены значения свойств BA.AccountNumber и BA.AccountBalance handle-объекта BA, так как выходная объект-переменная всегда создается сразу, до любых операций с ней. После этого вызывается метод addAccount класса AccountManager (этот вызов расположен в теле конструктора) с передачей ему найденного фактического параметра BA. При этом функция-метод addAccount в блоке classdef класса AccountManager принимает объект BA, вызывает метод addlistener класса handle и передает ему объект BA, имя InsufficientFunds события и callback-функцию assignStatus для слушателя (listener). Таким образом, слушатель и callback-функция становятся созданными и зарегистрированными. Никаких действий пока callback-функция не производит, так как она будет задействована только в случае стимулирования (включения или запуска) события, о чем должен сообщить метод notify.
Обратимся теперь к свойству AccountNumber объекта BA - наберем в командной строке:
BA.AccountNumber
MATLAB найдет указанное свойство и отобразит (так как в команде нет ограничителя «;») результат запроса в виде текущего номера счета:
ans =
1234567
Аналогичный запрос по балансу:
BA.AccountBalance
отображается как:
ans =
500
То же самое для статуса счета:
BA.AccountStatus % Запрос.
ans =
open % Ответ.
Последний результат вытекает из того обстоятельства, что свойство AccountStatus еще не было изменено и, следовательно, остается по умолчанию open.
Теперь предположим, что вы снимаете со счета $600:
BA.withdraw(600)
MATLAB вызовет метод withdraw (см. блок methods класса BankAccount), передаст ему объект BA (он указан в самой команде) и величину вычета 600 (на место входного аргумента amt). После проверки счета (первый if в теле метода withdraw) будет определено, что счет не закрыт (сообщения о закрытии счета не будет), поэтому следующими будут проведены операции по расчету (newbal = BA.AccountBalance – amt) и изменению (BA.AccountBalance = newbal) баланса (-100) счета. Очередной if покажет, что счет отрицательный, и будет выдано предупреждение notify о событии InsufficientFunds в объекте BA. Ранее зарегистрированная в методе addAccount класса AccountManager callback-функция assignStatus будет вызвана с фактическим параметром src (источник события) = BA (объект, где событие активизировано). Первый if в теле этой callback-функции подтвердит наличие отрицательного баланса, второй if определит, что перерасхода относительно границы $200 нет, поэтому далее будет сформировано значение overdrawn для свойства AccountStatus.
Новое обращение:
BA.AccountStatus
отразит текущее значение свойства AccountStatus объекта BA:
ans =
overdrawn
Сделаем дополнительный съем средств:
BA.withdraw(200)
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.