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

Для определения user-defined-события вы просто указываете имя внутри блока событий events. Событие стимулируется путем вызова унаследованного подклассом BankAccount метода notify суперкласса handle. Заметим, что в данном случае (user-defined-событие) имя события не является регламентированным - вы можете именовать его любой строкой и при возникновении события реализовать его теми действиями, которые выберете.

Implementing the BankAccount Class (Исполнение класса BankAccount)

В рассматриваемом классе, как и для других классов, в любом свойстве определяется только одно множество данных (контейнер данных) для всех инстанций класса BankAccount. Вы, вероятно, не захотите также оперировать  независимыми копиями какого-либо объекта-счета, чтобы в разных ситуациях работать только с исходным множеством данных этого счета. Поэтому класс BankAccount должен быть исполнен как handle-класс (класс, выведенный из суперкласса handle или его подкласса). Все копии любого его объекта (handle-объекта) будут обращаться только к одному и тому же множеству данных исходного счета.

DisplayFullyCommentedExampleCode (Отображение полностью комментированного примера кода)

Вы можете отобразить код для данного примера на временном окне, который содержит детальный комментарий и связи с родственными подразделами документации, щелкнув ссылки:

BankAccount class (Класс BankAccount);

AccountManager class (Класс AccountManager).

Вы можете открыть файлы обоих классов в  редакторе MATLAB, кликнув:

Open in editor (Открыть в редакторе).

Class Definition (Определение класса)

classdef BankAccount < handle % Подкласс класса handle.

   properties (Hidden) % Здесь Hidden означает скрытые свойства

                        % (не представляются при отображении класса).

      AccountStatus = 'open'; % Начальный статус пустого

                        % счета не может быть иным, в противном случае к вновь

                %  открытому счету нельзя будет обратиться.

   end

                %  Следующие свойства могут быть установлены только методами

                %  класса (и соответсвенно его объект-инстанций):

   properties (SetAccess = private)

      AccountNumber % Конкретный номер может быть задан только

                        % объектом для очередного создаваемого счета.

      AccountBalance = 0; % Начальный баланс для любого

                        %  открываемого счета; изменение баланса – только при

              % вложении или изъятии средств.

   end

                % Определите user-defined-событие InsufficientFunds:

   events

      InsufficientFunds

   end

   methods

      function BA = BankAccount...

          (AccountNumber,InitialBalance) % Конструктор

                                % счета. При открытии счета (т.е. объекта BA) можно

                %  задать его номер (по входному аргументу AccountNumber)

                %  и состояние баланса AccountBalance (по входному

             % аргументу InitialBalance):

         BA.AccountNumber = AccountNumber;

         BA.AccountBalance = InitialBalance;

        % Далее идет вызов метода addAccount вспомогательного класса

        % AccountManager; метод addAccount необходим для создания

        % и регистрации слушателя и его callback-функции с целью

        % выполнения нужных действий по событию InsufficientFunds

                                % в случае его возникновения:

                     AccountManager.addAccount(BA); %  Вызов метода

                                % addAccount класса AccountManager для

                  % обслуживания события InsufficientFunds, т.е. создания

                  % и регистрации слушателя этого события и callback-функции

                        % реагирования на событие.

      end

      function deposit(BA,amt) % Метод вложения средств

                                 % amt на счет BA; при этом меняется его баланс:

         BA.AccountBalance = BA.AccountBalance + amt;

                                % Если баланс положительный:

         if BA.AccountBalance > 0

                                        % то счет будет открыт:

            BA.AccountStatus = 'open';

                                        % Если баланс не положительный, статус счета

                                %  останется прежним (до операции deposit).

             end

      end

      function withdraw(BA,amt) % Снятие средств amt со счета

                        % BA. Если до этого результат функции strcmp (сравнивает

             % значение свойства AccountStatus и строку closed)  будет

                             % «истина» и баланс счета окажется отрицательным:

         if (strcmp(BA.AccountStatus,'closed')&&...

              BA.AccountBalance < 0),

                                        % то отображается сообщение о закрытом счете:

            disp(['Account',num2str...

                (BA.AccountNumber),...

                                    ' has been closed.']) % Сообщение: «Счет

                                                  % AccountNumber закрыт».

            return % Возврат в точку вызова.

         end

                     % Если указанные выше условия не выполняются,

                           % рассчитывается новый баланс:

         newbal = BA.AccountBalance - amt; % Расчет

                                % нового баланса.

         BA.AccountBalance = newbal; % Установка нового

                                % баланса. Если баланс newbal отрицательный:

                            if newbal < 0

                                % то посредством метода notify сообщается о

                                 % событии InsufficientFunds в объекте BA:

            notify(BA,'InsufficientFunds') % Сообщение о                                   % событии InsufficientFunds для слушателя,

                            % зарегистрированного ранее вместе с его callback-

                            % функцией реагирования (см. выше команду

                                 % AccountManager.addAccount).

         end

      end % withdraw