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

Как и в предыдущих случаях, находим, что сообщения о закрытии счета снова не будет (в операторе if метода withdraw значение первого логического компонента равно 0 - счет не был закрыт); новый баланс (newbal = BA.AccountBalance – amt) оказывается опять отрицательным (-300), поэтому повторится сообщение notify и вновь выполнится callback-функция  assignStatus, которая  обнаружит перерасход больший, чем $200. Новое значение свойства AccountStatus станет равным closed. Сказанное можно проверить по следующим запросам и ответам:

        BA.AccountBalance % Запрос.

        ans =

       -300 % Ответ.

   BA.AccountStatus % Запрос.

        ans =

       closed % Ответ.

Попытка дополнительного изъятия со счета:

        BA.withdraw(100)

при проверке состояния счета в первом if функции-методе withdraw приводит к выдаче сообщения:

        Account 1234567 has been closed (Счет 1234567 закрыт)

Номер счета 1234567 в последнем сообщении является результатом преобразования значения свойства  AccountNumber (число 1234567) объекта BA в символы 1234567 стандартной функцией num2str(BA.AccountNumber).

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

   BA.deposit(700)% Вложение.

        BA.AccountStatus % Запрос.

   ans =

       open % Ответ

и съем средств будет разрешен:

   BA.withdraw(100) % Съем средств.

   BA.AccountBalance % Запрос.

   ans =

       300 % Ответ

UsingObjectstoWriteDatatoaFile (Использование объектов для записи данных в файл)

В этом разделе:

FlexibleWorkflow (Гибкий рабочий процесс);

Performing a Task with an Object (Выполнение задачи с объектом);

Using Objects in Functions (Использование объектов в функциях).

Flexible Workflow (Гибкий рабочий процесс)

Язык MATLAB не требует от вас определения классов для всех кодов, которые вы пишете. Вы можете использовать объекты вместе с обычными функциями. Этот раздел иллюстрирует использование объекта (который выполняет обобщенную задачу написания текста в файл) в функции для написания конкретного текста шаблона определения класса.

Performing a Task with an Object (Выполнение задачи с объектом)

Одним из преимуществ определения класса по сравнению с обычной функцией для выполнения задачи является то, что класс обеспечивает лучший контроль за связанными данными. Например, рассмотрим задачу занесения данных в файл. Она включает следующие шаги:

w Открытие файла для определения и сохранения его идентификатора;

w Использование идентификатора файла для внесения данных в файл;

w Использование идентификатора файла для закрытия файла.

The Filewriter Class (Класс Filewriter)

Следующее простое определение класса иллюстрирует, как вы можете создать класс для написания текста в файл. Оно показывает, как можно использовать преимущества класса за счет:

w Сокрытия приватных данных – клиенту, вызывающему файл, не нужно управлять идентификатором файла;

w Гарантии того, что используется всегда только один идентификатор файла класса - копии handle-объектов обращаются к одному и тому же оригиналу;

w Обеспечения автоматического закрытия файла, когда рабочий объект уничтожается – специальный объектный метод берет на себя эту задачу без явного вызова.

Этот класс (Filewriter) выведен из суперкласса handle, поэтому текущий Filewriter-объект, конкретно используемый для записи данных в файл, является handle-объектом. Все копии handle-объектов пользуются одними и теми же внутренними данными, поэтому будет использован только один идентификатор файла, даже если вы делаете копии handle-объекта. Следовательно, handle-классы определяют также общий (для всех копий какого-либо handle-объекта) метод уничтожения (delete-метод), который вызывается автоматически, когда handle-объект или любая его копия устраняется. Нижеследующий пример  переопределяет стандартный метод delete так, чтобы файл закрыть прежде, чем идентификатор файла будет потерян (при этом сам файл останется открытым):

classdef Filewriter < handle

                % Следующие свойства являются приватными для класса:

   properties (SetAccess = private, GetAccess = ...

          private)

     FileID % User-defined-свойство класса, хранящее

                        % идентификатор файла (его значение  для каждого объекта -

            % представителя этого класса будет определяться конкретным

                % файлом, с которым объект будет работать).

       end % properties

   methods

                % Далее следуют конструктор Filewriter-объекта и оператор

      %  определения и сохранения идентификатора в FileID  для

           %  последующих работ:

      function obj = Filewriter(filename) % Конструктор

          % Filewriter-объекта obj для записи данных в файл

              % filename (следует учесть, что filename – формальный

              %  параметр, его значение в виде принимаемого фактического

                           %  параметра будет строкой символов в кавычках).

         obj.FileID = fopen(filename,'a'); % Определение

                            %  идентификатора файла filename и сохранение его в

                     %  свойстве FileID объекта obj; идентификатор

                     %  определяется при вызове стандартной функции fopen; в

                     %  соответствии с требованием символа «a» идентификатор

                     %  позволяет записывать информацию в последнюю строку

                     %  файла filename. Если файл filename не существует,

                        % он будет создан автоматически.

      end

      function writeToFile(obj,text_str) % Функция «писать

                        %  в файл» с помощью  Filewriter-объекта obj, хранящего

                           % идентификатор файла в свойстве FileID.

         fprintf(obj.FileID,'%s\n',text_str); % Стандарт-

                                % ная функция записи строки (как значение аргумента

                     % text_str) в файл с идентификатором, взятым из FileID.

      end

        % Далее вызывается delete-метод класса Filewriter до того, как