MATLAB R2008a. Классы. Часть1: Учебное пособие, страница 17

   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)