
Министерство образования и науки Российской Федерации
Рязанский государственный радиотехнический университет
В.Ф. ОДИНОКОВ
MATLAB R2008a. КЛАССЫ
Часть 1
Учебное пособие
Рязань 2011
УДК 519.68 (075.8)
MATLABR2008a. Классы. Часть 1: учеб. пособие / В.Ф. Одиноков; Рязан. гос. радиотехн. ун-т. - Рязань, 2011. - 84 с.
Рассматриваются основные понятия и элементы MATLAB-классов версии 7.6.0 (R2008a).
Предназначено для студентов специальностей 230201 - "Информационные системы и технологии", 230203 – "Информационные технологии в дизайне", 230204 – "Информационные технологии в медиаиндустрии", бакалавров направления 230200 – "Информационные системы", студентов заочной формы обучения по специальности 230201, магистрантов и аспирантов.
Табл. 3. Библиогр.: 2 назв.
В создании пособия принимала участие студентка гр. 735 Степанова Н.В.
Классы, подклассы, объекты, методы
Печатается по решению редакционно-издательского совета Рязанского государственного радиотехнического университета.
Рецензент: кафедра автоматизированных систем управления Рязанского государственного радиотехнического университета (зав. кафедрой д-р техн. наук, проф. Г.И. Нечаев)
Рязанский государственный
радиотехнический университет, 2011
Введение
Без моделирования различных объектов и протекающих в них процессов невозможны почти никакие серьезные исследования и разработки ни в одной из областей знаний. Повышению производительности труда при этом способствуют разнообразные (готовые) системы программной имитации. Одной из таких систем является универсальный пакет МATLAB 7.6.0 (R2008а), включающий ряд функциональных элементов. Все они представлены соответствующими разделами в путеводителеHelpNavigatorокнаHelpbrowser (справочник) пакета МATLAB. Среди них важнейшим является раздел МATLAB(Матричная лаборатория). Он содержит язык, методологию и средства программирования. Программирование в системе МATLAB основано на объектно-ориентированной технологии. Последняя изложена в подразделеMATLAB Classes and Object-Oriented Programming(MATLAB-классы и объектно-ориентированное программирование) разделаМATLAB.
Отсутствие русифицированного варианта пакета МATLAB создает значительные трудности при работе с ним. Различная литература [1, 2] по системе МATLAB на русском языке только отчасти решает отмеченную проблему, поскольку преследует, в основном, учебные цели. В отличие от этого данное пособие ориентировано на непосредственноеобщение с МATLAB-документами, так как является, по сути дела, синхронным (по темамHelp-навигатора) переводом вышеуказанного подраздела системы МATLAB с необходимыми авторскими дополнениями.
ЭлектронныйHelp-справочник пакета
МATLAB, имея цветовое оформление и
автоматические ссылки на соответствующие
страницы МATLAB-документации, не может
быть полностью воспроизведен в
черно-белом варианте бумажного носителя
данного пособия. Поэтому следует
отметить ряд формальных моментов. Так,
смысловое ударение на слова и фразы в
тексте пособия показанонаклоннымшрифтом. Цветовое выделение всехзаголовков, функций и ключевых словокнаHelpв пособии замененожирнымшрифтом.Графическиецветовые элементы пакета МATLAB в данном
материале различаются только оттенками
серого тона. Всё выделенное жирным
шрифтом иподчеркнутоев пособии
означаетавтоматический вызоввHelpсоответствующих страниц
пакета при однократном нажатии (клике)
левой кнопкой мыши таких ссылок-связей.Специальновыделяемые в тексте
пособия элементы окружены символами
«». Расстановка абзацев и табуляцияподчиняются, в основном, правилам
окнаHelp. Шрифт обычного
текста пособия -TimesNewRoman, программный код -Courier
New,
названия разделов и подразделов -Arial
Black. Знаки «%»послестрок
программного кода означают начало или
продолжение неисполняемого
текста-комментария; наличие или отсутствие
ограничителя «;» в конце строккодаопределяется синтаксисомязыкаMATLAB; многоточие «…» без
разрядки (шрифтTimesNewRoman) означает «и т.д.»,
«проч.», «и др.»; многоточие «...»
с разрядкой (шрифтCourier
New)
– перенос продолжения строки кода.
Понятия «раздел» и «подраздел» условны:
любойподразделкак отдельный
тематический элементHelp-навигатора
является обобщающим разделомдля
своих внутренних структурных составляющих.
MATLAB Classes and Object-Oriented Programming (MATLAB-классы и объектно-ориентированное программирование)
Ниже даны названия и краткие характеристики структурных частей данного компонента пакета MATLAB:
Getting Started (Начало) – введение в объекты языкаMATLAB;
MATLAB Classes Overview (ОбзорMATLAB-классов) – начало созданияMATLAB-классов;
Working with Classes (Работа с классами) – определение классов и использование их атрибутов;
Value or Handle Class — Which to Use (Value- или handle-класс – что использовать) – типы классов – value- и handle-классы;
Building on Other Classes(Конструирование из других классов) – принципы и практика создания иерархии классов;
Properties — Storing Class Data(Свойства – хранение данных класса) – введение в определение и синтаксис свойств как контейнеров для данных класса;
Methods — Defining Class Operations(Методы – определение операций классов) – классы, свойства, методы и их поведение;
Events — Sending and Responding to Messages(События – посылка и реагирование на сообщения) – события позволяют реагировать программе на возникающие изменения;
Implementing a Class for Polynomials(Организация класса полиномов) – разработка класса для представления полиномов;
Designing Related Classes(Создание связанных классов) – пример иерархии классов.
Getting Started (Начало)
Where to Begin(Где начинать) – выбор страниц документовMATLABв соответствии с опытом работы пользователя;
Why Use Object-Oriented Design(Почему используется объектно-ориентированная разработка) – как объектно-ориентированное программирование (OOPвHelp) обеспечивает преимущества в работе;
Class Diagrams Used in This Documentation(Диаграммы классов, использованные в этих документах) – понятия диаграмм классов и объектов.
Where To Begin (Где начинать)
В этом разделе: |
Video Demo of MATLAB Classes (Видеодемонстрация MATLAB-классов);
MATLAB Programmer Without Object-Oriented Programming Experience (MATLAB-пользователь без опыта объектно-ориентированного программирования);
MATLAB Programmer with Object-Oriented Programming Experience (MATLAB-пользователь с опытом объектно-ориентированного программирования). |
Video Demo Of Matlab Classes (Видеодемонстрация MATLAB-классов)
Вы можете наблюдать краткую презентацию по эволюции MATLAB-классов, щелкнув ссылку (при наличии Интернет-связи):
Play demo(Демонстрация)
Matlab Programmer Without Object-Oriented Programming Experience (MATLAB-пользователь без опыта объектно-ориентированного программирования)
Если вы создаете MATLAB-программу, но не знакомы с классами, начинайте со следующих разделов:
Why Use Object-Oriented Design(Почему используется объектно-ориентированная разработка);
MATLAB Classes(MATLAB-классы);
Examples to Get Started (Примеры для начала);
Learning Object-Oriented Programming(Изучение объектно-ориентированного программирования).
Matlab Programmer With Object-Oriented Programming Experience(MATLAB-пользователь с опытом объектно-ориентированного программирования)
Если вы знакомы с MATLAB-программированием и объектно-ориентированной технологией, начинайте со следующих разделов:
Defining Classes — Syntax Overview(Определение классов – синтаксический обзор);
Detailed Information and Examples (Детальная информация и примеры);
Compatibility with Previous Versions(Совместимость с предыдущими версиями);
MATLAB and Other OO Languages - MATLAB и другие ОО (объектно-ориентированные) языки.
Why Use Object-Oriented Design(Почему используется объектно-ориентированная разработка)
В этом разделе: |
Approaches to Writing MATLAB Programs (Подходы к написанию MATLAB-программ);
When Should You Start Creating Object-Oriented Programs (Когда вам следует начинать создание объектно-ориентированных программ). |
Approaches To Writing Matlab Programs (Подходы к написанию MATLAB-программ)
Создание программных приложений обычно предполагает разработку способа представления данных и определения операций над этими данными. Процедурныепрограммы обычно посылают данные в явном виде функциям, которые исполняют необходимые операции над этими данными.Объектно-ориентированныепрограммы оперируютклассами, подклассами иобъектами- представителями обобщающего их класса или подкласса, которые взаимодействуют между собой посредством интерфейсных операций и содержат (скрывают или инкапсулируют) необходимые данные.
Язык MATLABпозволяет создавать программы процедурных, объектно-ориентированных и комбинированных типов (ссовместнымиспользованием классов, подклассов, объектов и обычных функций).
Procedural Programming Design (Процедурная программная разработка)
В процедурном программировании вы концентрируете внимание на шагах, выполняемых для достижения цели. Вы обычно представляете данные какпеременныеили поляMATLAB-структур, а операции – как классическиепроцедуры-функции, которые принимают переменные-аргументыи используют их. Программы обычно вызывают функциипоследовательно. Каждая функция выполняет одну или несколько операций над данными.
Object-Oriented Programming Design(Объектно-ориентированная программная разработка)
Объектно-ориентированная разработка программ включает:
идентификацию (формулирование) отдельных (индивидуальных)компонентовсистемы или приложения;
анализ и идентификацию прототипов(образцов) для определенияобщей формыкомпонентов, которые используются неоднократно или имеют общие характеристики;
классификацию (иерархическую организацию) компонентов, основанную на их однотипности или различии.
После выполнения указанных шагов необходимо формально строго описать (программно определить) классы (подклассы) и их составные части.
Classes and Objects (Классы и объекты)
Классописывает общиехарактеристики множества его представителей (инстанций) класса. Класс имеет, помимо прочего,свойства(хранилища данных) иметоды(процедуры) обработки данных, относящиесяко всемего инстанциям. В качестве инстанций могут выступать подклассы и/или объекты. Подклассы - это более узко определенные категории исходного (базового) класса (суперкласса), которые могут иметь, кроме общих, также свои особенности (например, дополнительные свойства и методы и/или свои варианты общих методов), а объекты являются последней ступенью реализации обобщающего их класса (подкласса). Для объектов значенияунаследованных от класса (подкласса) свойств определяютотличиеданного объекта от других объектов того же класса (подкласса), а специфические свойства и операции – отличия объектов от их обобщающих классов. С учетом наследуемости общих характеристик подклассы и их объекты являютсявариантамипроизводных формбазовыхклассов. Таким образом, любой класс (подкласс) выполняет рольинтерфейса(связки) между его представителями,позволяяим использовать (наследовать) его обобщенные компоненты и определять (задавать или формулировать) какотличающиесянаследуемые, так идополнительные собственныепараметры. ВсеMATLAB-классы делятся на встроенные иuser-defined(разрабатываемыеMATLAB-пользователями) классы.
Using Objects in MATLAB Programs(Использование объектов вMATLAB-программах)
Язык MATLABописывает некоторые объекты, которые ужесодержатся(встроены) в пакете и готовы для использования в любыхMATLAB-кодах. Например, рассмотрим стандартную программную конструкциюtry-catchязыкаMATLAB.
Если код функции или операции, выполненный внутри блока try(начало всей конструкцииtry-catch), генерирует ошибку, дальнейшие действия автоматически переносятся в следующий блокcatchдля обеспеченияспециальной(определенной программистом) обработки возникшей ошибки. Разумеется, для эффективной обработки ошибки необходимо иметьдостаточноинформации о ней.
MATLABпредоставляетдетальную информациюоб ошибкес помощьюспециализированногообъекта ME(при возникновении ошибкиMATLABавтоматически создает объектME, его название в конструкцииtry-catchможно изменить) классаMException(данное имя стандартизовано). Этот объект передается в особую встроеннуюMATLAB-функцию, выполняющую всю работу в конструкции try-catch.
Ниже дан пример блоков try-catch, которые выдают сообщение об ошибке:
try % Начало конструкцииtry-catch и блокаtry.
surf% Неверный вызов стандартнойMATLAB-функцииsurf
% (нет необходимых аргументов), поэтому произойдет
% автоматический переход к блоку catch:
catchME% Конец блокаtryи начало блокаcatch с указанием
% объекта ME, содержащего информацию об ошибке.
disp(ME.message)% Вызов стандартнойMATLAB-функции
% disp(отображение на экране) с аргументом
% ME.message(свойствомmessageобъектаME, где хранится
% сообщение об ошибке); обращение к функции dispявляется
% содержанием и смыслом данного блокаcatch.
end % Конец блокаcatch и всей конструкцииtry-catch.
Результат выполнения приведенного кода try-catchна экране монитора (в соответствии с функциейdisp) будет иметь следующий вид (показанный ниже текст для каждого вида ошибки пишетсязаранеевMATLAB-файлы и автоматически используется при создании объектаME):
Not enough input arguments (Нет необходимых входных аргументов).
Данное сообщение, взятое из свойства messageобъектаME, – далеко не вся информация, имеющаяся в объектеME.
Другая информация содержится в остальных свойствах объекта ME. Имена всех общедоступных (public) свойств классаMException, к которому принадлежит объектME(MException-объект), можно увидеть с помощью стандартнойMATLAB-функцииproperties(до обращения к объектуMEпоследний долженбыть создан, т.е. должна быть предварительновыполненаконструкцияtry-catch):
properties(ME)% Вызов функции properties с конкретным,
% ранее созданным объектом-аргументом ME.
Результат вызова функции properties на экране монитора:
Properties for class MException (Свойства класса MException):
identifier– идентификатор (сообщения)
message– сообщение (об ошибке))
cause- причина (сообщения)
stack- папка (данных) – см. ниже.
Objects Organize Data(Объекты организуют данные)
Организация хранения данных в свойствах объектов во многом подобна полям MATLAB-структур. Поэтому при обращении к свойствам необходимо использоватьdot-нотацию (точки), например,ME.message. При запросах это приводит к возвращению и, при необходимости, отображению запрашиваемых характеристик свойства. Например, запрос на тип класса свойстваmessageобъектаMEимеет вид:
class(ME.message)% Вызов стандартнойMATLAB-функции
% class (класс аргумента) с аргументомME.message.
Результат вызова функции class на экране для предыдущего объектаME (вывод представлен в виде стандартнойMATLAB-переменнойans):
ans = % Стандартный идентификатор, его значение:
char % Класс аргументаME.message.
Ответ на обращение class(ME.message)показывает, что запрашиваемая характеристика (класс величины) свойства messageдля нашего объектаME есть массив классаchar (текстовая строка). Другое свойство (stack) объектаMEсодержит MATLAB-структуру с именемstack. Запрос на характеристику данной структуры имеет вид:
ME.stack% Обращение к свойствуstack(к структуреstack)
% объекта ME.
Результат последнего запроса выводится в виде значений полей file (файл),name(имя) иline(строка) структурыstack:
ans =
file: 'C:\Program Files\MATLAB\R2008a\...
toolbox\matlab\graph3d\surf.m' % Значение
% элемента file (полеfileструктурыstack)свойстваstack
% указывает путь к файлу surf.m, содержащему функцию
% surf(директория на экране дается непрерывной строкой, здесь
% строка разделена на две части из-за ограниченной ширины
% листа).
name: 'surf'% Содержание поляname структурыstack–
% имя функции, генерирующей ошибку.
line:50 % Содержание (номер строки кода функции, указанной
% в поле name) поля lineструктурыstack(в строке 50 для % surfдан оператор вызова функцииerror, определяющей
% сообщение об ошибке)
Можно трактовать обращение к свойству ME.stack объектаMEпросто как ссылку к одноименной структуреstack и обычным образом вызывать её поля. Например (применительно к полюfile):
ME.stack.file% Обращение к частиfileсвойстваstack
% (обращение к полю fileодноименной структуры
% stackв данном свойстве) объекта ME.
Результат обращения для нашего случая – вышеприведенная директория:
ans =
C:\Program Files\MATLAB\R2008a\toolbox\...
matlab\graph3d\surf.m
Очевидно, что поле file структуры, содержащейся в свойствеstack, является массивом символов. Это можно проверить командой:
class(ME.stack.file)% Запрос на тип класса аргумента
% ME.stack.file.
Ответ на запрос:
ans =
char% Символьный тип.
Ссылку на свойство можно использовать в какой-либо MATLAB-функции. Например, обращение к полюnameструктурыstackобъектаMEс помощью стандартной функцииstrcmp(сравнение строк символов) может иметь вид:
strcmp(ME.stack.name,'surf')% Вызов функцииstrcmpдля
% сравнения символов в поле nameи слове surf.
Результат вызова функции strcmpдля прежнего объектаME:
ans =
1 % Значение переменнойans, показывающее, что
% сравниваемые строки одинаковые, поскольку для
% рассматриваемого случая содержание поляnameесть
% само имя функции surf.
Свойства объектов могут включать (иметь) различные классы величин при их начальном определении и могут определять свои величины динамическив процессе работы программы.
Objects Manage Their Own Data(Объекты управляют своими собственными данными)
Вы можете написать функцию, которая, например, генерирует отчет об ошибках по данным в свойствах MException-объектов. Эта функция может оказаться довольно сложной, поскольку она должна обработать все возможные ошибки. Вероятно, вам придется использовать разные функции для различных блоковtry-catchв программе. В этом случае проще использовать возможности управления данными самих объектов классаMException.
Объекты, как было отмечено выше, для управления данными используют методы классов и их подклассов. При этом любые реализуемыеобъектами методы и операции становятсяобъектными. Одним из таких методов может быть генерация отчета. Методы какого-либо класса, реализуемые объектами, являются наследуемой (не копируемой) частью кода объекта. Код самого объектав деталяхможет быть модифицирован много раз, нообщийинтерфейс (операции взаимодействия), определенный классом при работе объекта с другими (внешними по отношению к объекту) программами, а также код, заданный классом и используемый любой инстанцией класса, сохраняются. При работе объекта с данными совокупность используемых им интерфейсных операций представляет собойобъектныйинтерфейс.
Чтобы увидеть, какие существуют методы класса, наследуемые созданнымиобъектами классаMException, используйте встроенную функциюmethods. Например:
methods(ME)% Запрос на методы класса, наследуемые % предварительно созданным MException-объектомME.
Результат запроса:
Methods for class MException(Методы для класса
MException):
addCause eq isequal rethrow
ctranspose fieldnames ne throw
disp fields permute throwAsCaller
display getReport reshape transpose
Вы можете использовать эти методы (MException-методы или объектные методы для объект-инстанций классаMException) подобно другим элементам языкаMATLAB, когдаMException-объектынаходятся в рабочей области(workspace) памяти средыMATLAB. Например:
ME.getReport % Запрос на отчет;getReport – метод класса
% MException (MException-getReport-метод,MException-метод
% getReport или getReport-метод класса MException), он же -
% объектный метод инстанции ME; формирует отчет по данным
% объекта ME, находящегося в рабочей областиworkspace).
Результат запроса – отчет об ошибках; для рассмотренного случая функции surf имеем:
ans =
??? Error using ==> surf at 50 (Ошибка - см. код для функцииsurfв строке 50):
Not enough input arguments (Нет необходимых входных аргументов).
Классы и их производные формы часто имеют методы, которые заменяют (переопределяют - overload) стандартные (встроенные в пакет)MATLAB-функции. Это позволяет использовать объектыпо аналогии с другими стандартнымиMATLAB-величинами. Так, классMExceptionимеет методisequal, который сравниваетMException-объекты тем же путем, что и сравнение переменных, например типаdouble, стандартнойMATLAB-функциейisequal. Для иллюстрации: еслиMEиME2 являютсяMException-объектами, их можно сравнить с помощью такого выражения:
isequal(ME,ME2)
Следует учесть, что в приведенном операторе аргументы ME,ME2 являются не обычными переменными, аобъектами, поэтому они будут автоматически посланыне встроеннойMATLAB-функцииisequal, а методуisequal, определенному классомMException (MException-isequal-метод, MException-методisequalилиisequal-метод класса MException).
Аналогично MException-метод eq(см. выше результат командыmethods) позволяет использовать стандартную форму синтаксисаMATLAB-функцииeq(оператор «==») сMException-объектами:
ME == ME2
Конечно, объекты при работе с данными должны поддерживать только те методы и операции, которые необходимы. Например, ни к чему переопределять MATLAB-функцию перемножения объектов классаMException, так как для объектов такого класса эта операция простоне имеет смысла.
When Should You Start Creating Object-Oriented Programs (Когда вам следует начинать создание объектно-ориентированных программ)
Объекты хорошо интегрированы с языком MATLABнезависимо от того, пишете ли вы простые функции, работаете интерактивно в командном окне или создаете сложные приложения.
Простые программные задачи проще представлять в виде обычных функций, но когда состав и сложность задач возрастают, эти функции становятся слишком объемными и трудными для управления.
Когда обычные функции-процедуры становятся слишком большими, вы можете разделить их на более мелкие функции и передавать данные от одной функции к другой. Однако когда число функций становится значительным, проектирование и управление данными, посылаемыми функциям, становится трудным и чревато ошибками. С этой точки зрения вам следует рассмотреть решение ваших задач средствами объектно-ориентированного программирования.
Understanding a Problem in Terms of Its Objects (Понимание проблемы в терминах её объектов)
Мыслить в терминах предметов или объектов гораздо проще и более естественно для многих проблем. Можно, например, думать именами собственными как объектами, которые следует определить, а глаголами -
как операциями, которые необходимо выполнить.
Для конкретности проделаем анализ таких физических экономических организаций, как банки и ипотечные компании. Можно представить каждую из таких организаций как некоторый объект, который выполняет определенную функцию и работает с определенными данными. Процесс создания таких объектов включает определение их характеристик, которые важны для вашего случая, и, возможно, учет ряда других обстоятельств.
Идентификация идентичности(унифицируемость). Вышеуказанные конкретные организации при всех их различиях можно объединить вобщий класскредитных организаций, наделив его, к примеру, ссудными операциями-методами и свойством - хранилищем процентных ставок по ссуде. Данные характеристики все конкретные объекты-организациинаследуютот общего класса кредитных организаций, что составляет унифицированные компоненты всех индивидуальных объектов. Особенности каждой организации можно учесть при анализе их параметров.
Идентификация различий.Теперь рассмотрим возможные отличия каждой организации. Например, ипотечная компания может обеспечивать только жилищные ссуды. Поэтому ссудная операция ипотечных компаний должна бытьспециализированадля обеспечения фиксированных (fixRateLoan) и плавающих (varRateLoan) процентных оценочных методов, соответствующих двум известным типам ипотечных ссуд. Это будет дополнениемк тем характеристикам общего класса кредитных организаций, инстанции которых (в данном случае ипотечные компании) наследуют как представители общего класса. Общие для ипотечных компаний характеристики целесообразно объединить в подклассе ипотечных компаний, наследующем также и общие для класса кредитных организаций компоненты. То же самое можно сделать и для банков.
Рассмотрение взаимодействия. Любые организации могут взаимодействовать. Например, ипотечная компания может продать ипотеку банку. Для реализации этой операции объект - ипотечная компания должен поддерживать операцию продажи (sellMortgagу) ипотеки, а объект– банк должен поддерживать операцию покупки (buyMortgage) ипотеки. Перечисленные операции являются очередными дополнениями к наследуемым характеристикам базового класса, которые легко определить как добавочные методы соответствующих подклассов. Эти дополнения, как и другие, автоматически будут наследованы всеми конкретными объектами подклассов – частными банками и ипотечными компаниями.
Кроме исходных (в данном случае банки и ипотечные компании) основных объектов, вы можете также определить (сформулировать) вспомогательныеобъекты, взаимодействующие с исходными объектами. Эти вспомогательные объекты составят свой класс. Пусть таким классом будетинститут ссуд, а его объектами -объекты-ссуды, которые будут представлять конкретные ссуды конкретных физических кредиторов. Институт ссуд может иметь любые свойства и методы. Он, например, может иметь свойстваAmount(Величина),Rate(Процент) иLender(Кредитор ). Когда возможность давать ссуду продана другой организации (например, ипотечная компания – банку), значение свойстваLenderобъекта-ссуды, представляющего конкретную ссуду, должно быть изменено (вместо ипотечной компании кредитором будет банк), но вся другая информация должна быть сохранена внутри этого объекта-ссуды. Ясно, что этот класс позволяет выделить и обобщить ряд важных характеристик в одно целое – институт ссуды. Теперь другие программные единицы могут иметь дело не с кодами разных физических организаций-кредиторов, а со специальным институтом ссуды и его объектами. Отдельные объекты-ссуды далее могут быть привязаны к другим физическим объектам, например клиентам, так как каждая ссуда предполагает такого клиента.
Добавляйте только необходимое. Возможно, что рассматриваемые организации и институты обладают многими другими активностями, которые не представляют интереса для вашего случая. Поэтому на этапе проектирования нужно определить,какиеоперации и данные объект должен включатьв соответствиис проблемой.
Управление данными. Объект инкапсулирует (содержит внутри себя) модель (дается определениями-формулировками класса, подкласса и объекта), которая задает управление данными, находящимися в распоряжении объекта. Если объект является, например, кредитной организацией,всёповедение такой организации, которое требуется для вашего приложения при работе с данными, должно отображаться этим объектом. При необходимости объекты могутизменитьсвое поведение модификацией объектных методов. Последнее упрощает управление данными, которые использованы вконкретномприложении.
Objects Manage Internal State(Объекты управляют внутренним состоянием)
В тривиальном смысле объекты являются структурами данных, которые инкапсулируют (прячут) внутреннее объектное состояние, к которому вы обращаетесь посредством операций-методов. Когда вы привлекаете метод, он точно определяет (диктует), что делать с данными. При этом два объекта одного класса могут выполнять разные вариантыкодов для вызванного ими общего метода, поскольку состояния этих объектов могут быть различны. Внутренний механизм любого объекта обычно автономен и не определяется какой-либо частью внешней программы, которая при работе с ним просто использует интерфейс, представляемый ей объектом.
Сокрытие внутреннего состояния объектов от посторонних программ дает более устойчивый код. Если, например, значение свойства Lenderобъекта-ссуды может изменятьсятолько объектнымметодомnewLender(новый кредитор), случайный доступ извне менее вероятен по сравнению с тем, когда информационные данные по ссуде хранятся в ячейках обычного массива, и любое внешнее индексное выражение может извлечь или изменить их (обычные типы данных доступны любым программам).
Объекты обеспечивают некоторое число полезных возможностей, которые не достижимы обычными MATLAB-структурами и ячейками массивов. Например, объекты позволяют:
тестировать величины при любом назначении данных тому или иному свойству посредством выполнения соответствующей функции;
рассчитывать величину свойства только тогда, когда она запрашивается; при этом не требуется хранение таких величин, поскольку они постоянно зависимы от других данных;
передавать сообщения, когда запрашивается или изменяется любая величина какого-либо свойства, на которые любое количество приемников сообщений (слушателей) могут реагировать выполнением некоторых функций (callback-функций);
ограничить доступ к любым свойствам и методам.
Reducing Redundancy(Ограничение избыточности)
Когда сложность вашей программы возрастает, преимущество объектно-ориентированной разработки становится более очевидным. Предположим, вам необходимо выполнить следующую процедуру:
Контроль входов;
Расчет по первому входному аргументу;
Преобразование результата шага 2, базируясь на втором входном аргументе;
Контроль правильности выходов и возвращаемых величин.
Эта простая процедура может быть выполнена как обычная функция. Теперь предположим, что нужно использовать эту процедуру вновь в вашем приложении, но шаг 2 должен быть иным. Вы можете просто скопировать шаги исполнения и затем переписать шаг 2. Или создать функцию, которая принимает опцию, указывающую, какой расчет сделать, и т.д. Однако этот путь приводит к все более сложному коду.
Объектно-ориентированная разработка может упростить решение задачи путем факторизации(задание конкретных элементов) кода базового классапри частномобращении к нему с учетомконкретнойситуации. Базовый класс должен определять только общие инструкции, рекомендуемые всем производным формам, которые используют этот код. Шаг 2 в последнем примере может быть определен при этомсинтаксически(общими указаниями) - не как исполняемый, позволяя это делать тем формам, на которые возлагаетсянепосредственнаяреализация шага, определяемаяна моментобращения к общему алгоритму. Например:
Шаг 1:
function checkInputs()% Начало функцииcheckInputs(в
% скобках должны быть входные аргументы).
… % actual implementation (действительное исполнение). Здесь
% расположены строки рабочегокодафункции
% checkInputs, так как при каждом обращении к коду
% этого шага не предполагается его изменять.
end
Шаг 2:
function results = computeOnFirstArg() % results –
% параметр, возвращаемый данной функцией.
… % specifysyntaxonly(только предписывающий синтаксис),
% например, «results = step2()» – где step2
% на момент обращения будет определяться вызывающим
% кодом, где есть своя программа для step2.
end
Шаг 3:
function transformResults()
… % actual implementation (действительное исполнение) –строки
% рабочего кода.
end
Шаг 4:
function out = checkOutputs()
… % actual implementation (действительное исполнение) –
% строки рабочего кода.
end
Еще раз отметим, что код базового класса при обращении к нему не копируется (не переписывается) и не модифицируется (модификации осуществляются производными формами), он простонаследуется(его непосредственно используют) всеми подклассами и объектами, которые вы выводите из базового класса. Это уменьшает объем (ограничивает избыточность) кода, который надо тестировать, и разделяет коды классов и других (внешних) частей программы.
Defining Consistent Interfaces(Определение согласованных интерфейсов)
Использование класса как базиса для аналогичных (производных), но более специализированных подклассов и объектов является полезной техникой в объектно-ориентированном программировании. Поэтому, как было сказано ранее, базовый класс называют интерфейсным классом. Включение этого свойства базового класса в вашу программную разработку позволяет вам:
Определять общие требования цели;
Кодировать эти требования в вашей программе как интерфейсный класс.
Например, предположим, что вы создаете особый класс (класс ошибок) объектов для возврата информации об ошибках, которые появляются во время выполнения определенных блоков программы. Выявлять ошибки могут специальные функции (методы данного интерфейсного класса), возвращающие информацию, которую вы хотите включить в отчет. Различие в информации об ошибках могут отобразить инстанции этого класса – подклассы и объекты ошибок.
Интерфейсный класс, из которого выведены подклассы и объекты ошибок, специфицирует (трактует), что все его производные формыдолжныподдерживать, например, методgetReport(генерация отчета), но сам интерфейсный класс может не определять точно, как выполняется метод. Тогда производные из класса формы должны выполнитьсвоюверсию методаgetReportбазового класса для обработки различных данных.
Иначе говоря, интерфейсный класс трактует, что все его подклассы и объекты ошибок способныотображать отчет об ошибках, общие черты которого определены в этом интерфейсном классе. В рассматриваемом плане, с учетом возможных модификаций производных форм, все программы, которые используют указанное свойство, могут быть гарантированно выполнены согласованным путем.
Любая производная форма, выведенная из интерфейсного класса и содержащая свой модифицированный метод (например,getReport), не имеет какого-либо конфликтасовпадающих наименований с исходным (базовым) классом, так как последний всегдазнает, какой именно метод будет вызван.
Reducing Complexity(Уменьшение сложности)
Объекты снижают сложность работы с моделью за счет уменьшения того, что вам надлежит знатьдля использования компонента или части системы. Это проявляется двумя путями:
Детали исполнения скрыты интерфейсами, которые определены классом и его объектами;
Правила взаимодействия объектов соблюдаются самими объектами и не являются заботой пользователей.
Для иллюстрации этих преимуществ рассмотрим исполнение структуры данных, называемой «двусвязный список», объекты (узлы) которого имеют по три свойства (Properties):
Для введения нового узла (с другим значением свойства Data) к списку, например на место объектаn2, предварительно выполним следующие очевидные шаги:
Отсоединим линию связи n2.Prev узлаn2 от узлаn1;
Отсоединим линию связи n2.Nextузлаn2 от узлаn3;
Отсоединим линию связи n3.Prevузлаn3 от узлаn2;
Отсоединим линию связи n1.Nextузлаn1 от узлаn2.
Получим такую разомкнутую структуру узлов (свойства Dataдля упрощения не показаны):
Отсоединенные
линии
Далее организуем связи с новым (new) узлом:
Связь new(былn2).Prev кn1;
Связь new(былn2).Next кn3;
Связь n1.Next кnew(былn2);
Связь n3.Prev кnew (былn2).
Теперь перенумеруем узлы. С учетом следующего (в данном случае четвертого) после n3узла получим связную структуру:
Новый узел
Как видим, акт введения нового узла в существующую структуру двусвязного списка требует некоторое число шагов. Любой обычный код, создающий структуру, подобную этой, может исполнить такие операции. Однако определение узлов связного списка как объектовдает возможность все операции по добавлению, исключению и ранжированию (порядку) узлов инкапсулировать (включить) в объектные методы. Коды, которые исполняют эти операции, могут быть хорошо протестированы, выполнены оптимальным образом, всегда могут получить конкретные данные текущей версии класса и могут даже автоматически обновить старые версии, когда они загружаются изMAT-файлов (специальные файлы хранения информации).
Объекты подчиняются правилам взаимного общения посредством методов. Поэтому, например, метод addNode (добавить узел) сам выполнит все шаги, приведенные выше и вовлекающие в работу несколько узлов. Это делает ненужной необходимость какого-либо принуждения со стороны того приложения, которое использует данные объекты. Это также означает меньшую вероятность генерации ошибок приложением при выполнении его собственных процессов с использованием рассмотренных объектов.
Такая реализация может уменьшить сложность вашего совокупного (с учетом использованных объектов) кода приложения, обеспечивая большую согласованность внутри его и меньший объем тестирования.
Fostering Modularity(Стимуляция модульности)
После декомпозиции системы на объекты (например: машина -->
--> двигатель --> система питания --> датчик кислорода) вы формируете коды-модули с необходимыми границами. Эти объекты-модули обеспечиваются интерфейсами, посредством которых они взаимодействуют с другими модулями (которые могут быть другими объектами или функциями). Обычно данные и операции, не относящиеся к интерфейсу, одного модуля скрыты от других модулей с целью взаимной автономности.
Классы обеспечивают три уровня контроля над кодовой модульностью:
Public (Общий) – любой код может иметь доступ к определенному свойству или вызвать определенный метод;
Protected (Защищенный) – только собственные методы объектов какого-либоклассаи объектов, чей подклассвыведениз первого класса, могут иметь доступ к свойствам и методам;
Private (Приватный или конфиденциальный) – только класс и собственные объекты данного классамогут иметь доступ к свойствам и методам.
Overloaded Functions and Operators(Переопределяемые функции и операторы)
Когда вы создаете user-definedкласс, вы можетепереопределитьнекоторую общуюстандартную функциюMATLAB для работыс вашимобъектом. Например, класспоследовательныхMATLAB-портовпереопределяетобщую стандартную функцию (fread)чтения данных из любых устройств, присоединенных к порту. Вы можете задать различные переопределяемые операторы для создаваемого класса из общих стандартных, например таких, как равенство (eq) или добавление (plus), для нужд представления и обработкивашихданных.
Reduce Code Redundancy(Уменьшение избыточности кода)
Эта способность объектно-ориентированного подхода уже рассматривалась. Приведем дополнительный пример. Допустим, что ваше приложение требует некоторого числа окон для интерактивной работы пользователей. Посредством определения класса, содержащего все общиеаспекты диалоговых окон, и последующего выведенияспециализированныхдиалоговых классов вы можете:
Использовать общий код для всех диалоговых окон;
Ограничить тестирование частных кодов, учитывая возможности общего кода;
Использовать общий интерфейс для целей диалога разработчиков;
Осуществить согласованное представление и восприятие всех окон;
Более просто реализовать общие изменения диалоговых окон.
Learning More(Дополнительное обучение)
Смотрите раздел MATLAB Classes(MATLAB-классы) для дополнительного изучения этапов объектно-ориентированной разработки.
Class Diagrams Used In This Documentation(Диаграммы классов, использованные в этом документе)
Диаграммы, представляющие классы, содержащиеся в этом документе, подчиняются соглашениям, показанным в следующей таблице:
Концепт
Пример
Объект
Класс
(агрегирование)
(композиция)
Графическое
представление
В таблице:
is_a– есть, принадлежит;
has_a– имеет, включает;
BankAccount – Банк счетов;
Properties – Свойства;
AccountNumber – Номер счета;
AccountBalance – Баланс счета;
Employee – Служащий;
Name – Имя;
Address – Адрес;
Asset –Авуары, Активы;
Stock– Основной фонд;
FileReader– Программа внесения записей в файл;
FileID– Идентификатор файла;
Car – Автомобиль;
Tire – Шина.
Matlab Classes Overview (Обзор MATLAB-классов)
Компоненты данного раздела и их краткие характеристики:
MATLAB Classes(MATLAB-классы) – классы в языкеMATLAB;
Detailed Information and Examples(Детальная информация и примеры) -ссылки на документы с подробной информацией;
Defining Classes — Syntax Overview (Определение классов –
синтаксический обзор) – синтаксис определения классов и величин атрибутов;
Developing Classes — Typical Workflow(Создание классов – типовой рабочий процесс) – как создать класс с использованием простого примера;
Using Objects to Write Data to a File(Использование объектов для записи данных в файл) – почему используется класс, а не обычная функция;
Using the Editor and Debugger with Classes(Использование редактора и отладчика с классами) – доступ к файлам классов из редактора и отладчика;
Compatibility with Previous Versions(Совместимость с предыдущими версиями) – использование старых и новыхMATLAB-классов;
MATLAB and Other OO Languages(MATLABи другие ОО языки) – сравнениеMATLABс другими объектно-ориентированными языками;
Example — Representing Structured Data(Пример – представление структурированных данных) – объекты являются более эффективными структурами данных;
Example — Implementing Linked Lists(Пример – исполнение связных списков) – пример, показывающий преимуществаhandle-класса для данного приложения;
Example — Class for Graphing Functions(Пример – класс графических функций) – пример, который показывает некоторые программные приемы.
Matlab Classes (MATLAB-классы)
В этом разделе: |
Classes in the MATLAB Language (Классы в языке MATLAB);
Some Basic Relationships (Некоторые базовые отношения);
Examples to Get Started (Примеры для начала);
Learning Object-Oriented Programming(Изучение объектно-ориентированного программирования).
|
Classes in the MATLAB Language (Классы в языке MATLAB)
В языке MATLABкаждой величиненазначается класс. Например, задание переменной-идентификатору величины с помощью оператора присваивания конструирует объектсоответствующегокласса (знаки «>>» в начале кода указывают на строку окнаCommandWindow- Командное окно):
>> a = 7; % Назначение числа7 переменнойaклассаdouble% (по умолчанию).
>> b = 'some string';% Назначение строки символов
% переменной bклассаchar(признак - кавычки).
Запрос по этим переменным (считаем, что других переменных в рабочей области MATLABнет) можно дать с помощью функции
>> whos % Обращение к функции отображения рабочей области.
Данный запрос в нашем случае предоставляет следующую информацию:
Name Size Bytes Class
(Имя) (Размер) (Байты) (Класс)
a 1x1 8 double (двойная точность)
b 1x11 22 char(символьная)
Основные команды, подобные функции whos, показывают класс каждой величины, имеющейся в рабочей области памятиMATLAB. Эта информация помогает пользователямMATLABвидеть, что некоторые величины являются символами и отображаются в виде текста, в то время как другие величины могут быть, например, с двойной или одинарной точностью или других числовых типов. Некоторые переменные, такие как массивы ячеек, могут содержать разные классы величин.
User-Defined Classes(Классы, определяемые пользователями)
Вы можете создать ваш собственный(не встроенный в пакетMATLABuser-defined) класс. Например, вы могли бы сформировать класс для представления полиномов. Этот класс может определять операции, соответствующие данному классу, по аналогии с обычными (стандартными)MATLAB-операциями суммирования, вычитания, индексирования, отображения вCommandWindowи т.д. Однако эти операции в данном случае необходимопереопределитьименно для суммирования ваших полиномов, вычитания полиномов и т.д. Например, когда вы суммируете два своих полиномиальных объекта
p1 + p2
оператор «+» (соответствует стандартной MATLAB-функцииplus) хотя и имеет здесь традиционный вид, свойственный встроенномустандартномуоператору суммированияобычныхчисел,должен знатьв данном случае, как суммировать именно вашиполиномиальныеобъекты, потому что ваш класс полиномов определяет эту операцию в соответствиисо своимиспецифическими целями, во многомотличающимисяот суммирования обычныхMATLAB-чисел.
Когда вы разрабатываете user-defined-класс, использующий операторы с именами стандартного типа, вы для него должны переопределить (разработать новые) стандартные функции-файлы (для оператора «+» это файл plus.m). Толькопереопределенныефункции (файлы), если таковые есть, вызываются MATLAB-программами, когда идентификаторы стандартных операций применяются к объектам user-defined-класса (не стандартного дляMATLAB).
Смотрите раздел Example — A Polynomial(Пример – полином), где даются вариант создания класса полиномов, работа с ним и его специфические характеристики.
MATLAB Classes — Key Terms (MATLAB-классы – ключевые понятия)
При описании MATLAB-классов используются следующие понятия:
Classdefinition(Определение класса) – описание того, что является общим для всех представителей класса, включающее определение свойств, методов и событий, а также атрибутов класса и его компонентов;
Properties(Свойства) – общие хранилища данных для класса и всех его представителей;
Methods(Методы) – специальные функции, выполняющие операции, которые присущи классу и всем его представителям;
Events(События) – сообщения, которые определены классом и реализуются представителями класса, когда создаются специфические условия, требующие определенных действий;
Attributes(Атрибуты) – величины,характеризующие поведение свойств, методов, событий и классов;
Listeners(Слушатели) – объекты, которые реагируют на события, выполняя некоторые действия (в форме callback-функций);
Objects(Объекты) – конкретные представители классов, которые, помимо наследования общих характеристик класса и подкласса, содержат индивидуальные данные, хранимые в объектных свойствах, и не имеют своих производных (выводимых) форм;
Subclasses(Подклассы) – более специфические классы, которые выведены из других классов (суперклассов), наследуют методы, свойства и события суперклассов и являются интерфейсными для своих инстанций;
Superclasses(Суперклассы) – общие классы, которые используются для создания более специализированных классов (подклассов);
Packages(Пакеты) – директории, которые содержат коды определения классов и методов и задают их области (сферы) действия (существования или рассмотрения).
Some Basic Relationships(Некоторые базовые отношения)
В этом разделе даны основные базовые концепции по MATLAB-классам. В отличие отMATLAB-функций, соответствующих только принадлежащим системеMATLABфайлам,MATLAB-классыобъединяютвстроенные стандартные классы исозданныеMATLAB-пользователями (user-defined) классы.
Classes(классы)
Класс есть понятие, которое специфицирует (определяет) общие характеристики всех представителей этого класса. Эти характеристики заданы свойствами, методами и событиями, определяющими класс, и величинами атрибутов, задающими поведение (состояние) класса и каждого его компонента. Определение класса, помимо прочего, может показать, как объекты класса создаются и уничтожаются, какие данные объект содержит и как можно манипулировать этими данными.
Class Hierarchies(Иерархии классов)
Иногда имеет смысл определить новый класс в терминах существующихклассов. Это позволяет использовать уже готовые разработки и техники в новом классе, представляющем собой некую сущность, наследующую характеристики исходных (исходного) классов. Такое использование достигается, как указывалось, созданием подкласса исходного класса (классов). Подкласс определяет объекты, являющиеся подмножеством подобных субстанций, определенных суперклассом (суперклассами). Подкласс является более специфичным, чем его суперкласс (суперклассы), и может содержать вместе с наследуемыми от общих базовых классов (класса) новые свойства, методы и события.
Математические множества могут помочь проиллюстрировать отношения между классами. Например, множество Положительных Целых (PositiveIntegers) есть подмножество Целых (Integers) и подмножество Положительных (Positives) чисел. Все три указанных множества, в свою очередь, являются подмножествами Реальных (Reals) чисел, которые входят в более общее множество Всех Чисел (All Numbers). Определение Положительных Целых требуетдополнительной(кAll Numbers) спецификации того, что элементы этого подмножества должны быть большими, чем ноль. Положительные Целые числа объединяют некоторые черты Целых и Положительных чисел и т.д.
Любое подмножество всегда более специфично и, следовательно, более узко определено, чем порождающие его исходные множества (супермножества), но все же имеет общие характеристики с ними. Последнее обусловливает важное обстоятельство - связи нижних компонентов иерархии множеств с верхними, т.е. их взаимную обусловленность и подчинение.
Специальный оператор-отношение (в общем тексте - «isa» - есть) показывает, определено ли подмножество в терминах существующих супермножеств. Например, следующие утверждения имеют смысл:
A Positive Integer is an Integer (Положительное Целое есть Целое);
A Positive Integer is a Positive number (Положительное Целое есть Положительное число).
Ниже показан вариант диаграммы, отражающей рассмотренную иерархию множеств и подмножеств:
Reusing Solutions(Многократное использование решений)
Как следует из вышеприведенного примера, классы могут организовывать таксономическую (классификационную) иерархию, которая стимулирует повторное использование вышестоящихкодов. Например, если вы определяете класс последовательных портов компьютера, он, вероятно, может быть во многом подобен классу параллельных портов. Чтобы использовать общие для двух типов портов элементы кода, эти элементы нужно определить как суперкласс и затем организовать подклассы для двух специфических портов.
Objects(Объекты)
Класс (как и подкласс) является прототипом(эталоном, моделью) для создания его инстанции – нового подкласса или простого объекта. Последняя инстанция – объект содержит данные дляиндивидуальнойконкретной сущности, которая порождена классом (подклассом). Например, такой инстанцией класса банковских счетов может являться объект, который представляет индивидуальный счет в банке со своим номером и балансом. Объекты не имеют своих производных форм.
Объекты являются не только пассивными хранителями данных. Объекты активно управляют содержащимися в них данными посредством выполнения разрешенных им объектных операций, скрывая данные, которые не предназначены для свободного доступа, и предотвращая тем самым искажения данных внешними клиентами, выполняющими операции, которые не запланированы объектами. Объектные методы также определяют порядок уничтожения представителей класса.
Encapsulating Information(Инкапсуляция информации)
Все объекты содержат (включают или инкапсулируют) свою собственную информацию-данные. Важный аспект объектов состоит в том, что вы можете написать программу, которая получает доступ к информации, хранящейся в объекте, через его объектные свойства и методы без необходимости знать, как эта информации хранится. Объект изолирует код, который добивается доступа к объекту, от внутреннего выполнения своих методов и свойств. Вы можете затем организовать любой интерфейс, наиболее приспособленный для планируемого использования вашим объектом другого (внешнего) класса, метода и/или объекта.
Examples to Get Started (Примеры для начала)
Следующие разделы иллюстрируют некоторые основные возможности MATLAB-классов:
Developing Classes — Typical Workflow(Создание классов – типовой рабочий процесс) – применяет объектно-ориентированное мышление к знакомым концептам для иллюстрации процесса создания классов;
Using Objects to Write Data to a File(Использование объектов для записи данных в файл) – показывает преимущества использования объектов для задания определенных операций и сопряжение ОО программирования с процедурно-ориентированным процессом;
Example — Representing Structured Data(Пример – представление структурированных данных) – дает приложение объектно-ориентированной техники для управления данными;
Example — Implementing Linked Lists(Пример – создание связных списков) – используетhandle-класс для создания двусвязного списка.
Learning Object-Oriented Programming(Изучение объектно-ориентированного программирования)
Следующие источники могут помочь вам освоить базовые знания по объектно-ориентированному планированию и концептам.
Shalloway, A., J. R. Trott, Design Patterns Explained A New Perspective on Object-Oriented Design. Boston, MA: Addison-Wesley 2002.
Gamma, E., R. Helm, R. Johnson, J. Vlissides, Design Patterns Elements of Reusable Object-Oriented Software. Boston, MA: Addison-Wesley 1995.
Freeman, E., Elisabeth Freeman, Kathy Sierra, Bert Bates, Head First Design Patterns. Sebastopol, CA 2004.
See Wikipedia : Object Oriented Programming (Объектно-ориентированное программирование).
Detailed Information And Examples (Детальная информация и примеры)
В этом разделе: |
Rapid Access to Information (Быстрый доступ к информации).
|
Rapid Access to Information (Быстрый доступ к информации)
Этот раздел предоставляет концептуальную информацию по классам и примеры исполнения. Ниже в таблице приведены важнейшие темы, разделы по теории и варианты реализации.
Таблица тем и ссылок
Тема |
Основная информация и пояснения |
Примеры кодов | ||
Классы | ||||
|
Список атрибутов всех компонентов класса: Attribute Tables(Таблицы атрибутов)
|
Developing Classes - Typical Workflow(Создание классов - типовой рабочий процесс) - простой пример
| ||
|
MATLAB Classes (MATLAB-классы) - введение к концепциям объектно-ориентированного программирования
Class Overview (Обзор классов) - экскурс в свойства классов |
Example - Representing Structured Data(Пример - представление структурированных данных)
Example — Implementing Linked Lists(Пример – исполнение связных списков)
Example - A Polynomial Class(Пример – класс полиномов)
Example - A Simple Class Hierarchy (Пример - простая иерархия классов)
Example - Containing Assets into a Portfolio (Пример – содержание активов в portfolio) | ||
Атрибуты |
Class Attributes(Атрибуты класса) - список атрибутов класса |
| ||
|
Hierarchies of Classes - Concepts(Иерархия классов - концепты) – описывает, как классы могут быть созданы из других классов |
Example - A Simple Class Hierarchy (Пример - простая иерархия классов) |
Продолжение таблицы
Тема |
Основная информация и пояснения |
Примеры кодов |
|
Creating Subclasses — Syntax and Techniques (Создание подклассов – синтаксис и техника)
|
Specializing the dlnode Class (Специализация класса dlnode)
|
|
Modifying Superclass Methods and Properties (Модификация методов и свойств суперклассов)
|
|
Типы классов |
Comparing Handle and Value Classes (Сравнение handle- и value-классов)
The Handle Base Class — a detailed description of the abstract class (Базовый класс handle - детальное описание абстрактного класса)
|
Example — Implementing Linked Lists (Пример - исполнение связных списков) |
Свойства | ||
|
Defining Properties(Определение свойств) - обзор того, что такое свойства и как их использовать
|
|
|
Property Definition Block(Блок определения свойств) показывает, как специфицировать начальные величины
|
Restricting Properties to Specific Values (Ограничение свойств специальными величинами) |
Атрибуты |
Specifying Property Attributes(Спецификация атрибутов свойств) - список атрибутов свойств
|
Dependent Properties(Зависимые свойства) |
Продолжение таблицы
Тема |
Основная информация и пояснения |
Примеры кодов | |
|
Dynamic Properties — Adding Properties to an Instance(Динамические свойства – добавление свойств к инстанции)
|
Attaching Data to the Object (Прикрепление данных к объекту) | |
Методы | |||
|
Class Methods(Методы классов) - обзор методов
|
| |
Атрибуты |
Method Attributes(Атрибуты методов) - список атрибутов методов
|
| |
|
Class Constructor Methods(Класс-конструктор-методы) - информация о методах создания объектов класса
|
Simplifying the Interface with a Constructor (Упрощение интерфейса с конструктором) | |
|
Handle Class Delete Methods (Delete-методы handle-классов)
|
| |
|
Controlling Property Access(Контроль доступа к свойству)
|
Restricting Properties to Specific Values(Ограничение свойств специальными величинами)
| |
|
Implementing a Set/Get Interface for Properties (Исполнение set/get-интерфейса для свойств)
|
| |
События | |||
|
Events and Listeners — Concepts(События и слушатели – концепты) - обзор того, как события работают
|
Example — Using Events to Update Graphs(Пример – использование событий для обновления графиков) - использование событий и слушателей |
Окончание таблицы
Тема |
Основная информация и пояснения |
Примеры кодов |
|
Defining Events and Listeners — Syntax and Techniques(Определение событий и слушателей – синтаксис и техника) - о синтаксисе, используемом при определении событий и слушателей |
|
Defining Classes — Syntax Overview(Определение классов – обзор синтаксиса)
В этом разделе: |
Class Building Blocks(Строительные блоки класса);
Class Directories (Директории классов);
The Classdef Block (Блок сlassdef );
Specifying Properties (Спецификация свойств);
Specifying Methods (Спецификация методов);
Specifying Events and Listeners (Спецификация событий и слушателей);
Specifying Attributes (Спецификация атрибутов);
Sample Class Syntax(Пример синтаксиса класса);
Functions Used with Objects(Функции, используемые с объектами).
|
Class Building Blocks(Строительные блоки класса)
Базовые компоненты в определении класса являются блоками, описывающими собственно класс или его части и специфицирующими их аспекты:
classdef-блоксодержит определение класса и его частей - файл, который начинается с ключевого словаclassdef и заканчивается ключевым словомend;
properties-блок(один для каждого уникального набораатрибутовспецификации) содержит определения одного или группы свойств для заданного уникального набора атрибутов, включая опционные (по умолчанию) начальные значения (величины). Блок свойств начинается с ключевого словаpropertiesи заканчивается ключевым словомend;
methods-блок(один для каждого уникального набора атрибутов спецификации) содержит определения одной или группы функций (методов класса) для заданного уникального набора атрибутов. Блок методов начинается с ключевого словаmethodsи заканчивается ключевым словомend;
events-блок(один для каждого уникального множества атрибутов спецификации) содержит одно или несколько имен событий. Блок событий начинается с ключевого словаevents и заканчивается ключевым словомend.
Заметьте, что properties,methodsиevents являются ключевыми словамитольков пределах блокаclassdef.
More In Depth Information (Более полная информация)
Разделы с информацией о компонентах определения класса:
Defining Classes — Syntax(Определение классов – синтаксис) – синтаксис класса;
Defining Properties(Определение свойств) – спецификация свойств;
Class Methods(Методы классов) – спецификация методов;
Defining Events and Listeners — Syntax and Techniques(Определение событий и слушателей – синтаксис и техника) – использование событий;
Attribute Tables(Таблицы атрибутов) – список всех атрибутов.
Class Directories(Директории классов)
Имеются два вида директорий классов:
Директория (обычная), содержащаяфайлы определения классов. Имя каждого файла класса должно соответствовать имени определяемого класса и имени его конструктора. Вы должны определить в этом файле классполностьюи можете установить на одной директории несколько файлов полных определений разных классов;
Директория @class_name(@-директория; вместоclass_nameдолжно быть конкретное имя класса), которая располагаетсявнутриобычной директории. Вы можете либо определить на директории@class_nameтолько один файл полного определения класса, либо использоватьнесколько(для разных элементов одного класса) файлов этого класса.
Смотрите подробности в разделе Methods in Separate Files(Методы в выделенных файлах).
More Information on Class Directories(Дополнительная информация о директориях классов)
Смотрите раздел Organizing Classes in Directories(Организация классов в директориях) для подробной информации о директориях классов и разделScoping Classes with Packages(Ограничение сферы классов пакетами) с информацией об использовании классов из пакетных директорий.
The Classdef Block (Блок сlassdef)
Блок classdefсодержит определение класса и его частей. В первой строке (начинается со словаclassdef) данного блока вы специфицируете:
Атрибуты класса;
Имя класса.
Суперклассы.
Блок classdef содержит субблоки properties, methods и events.
Assigning Class Attributes(Назначение атрибутов класса)
Атрибуты класса определяют поведение класса. Их список и значения по умолчанию системеMATLABстрого известны. Назначайте величины атрибутов класса, только когда вы хотите изменитьих.
Суперклассы и атрибуты, значения которых заданы по умолчанию, не указываютсяв определении, например:
classdefclass_name % Начало блокаclassdef; имя класса –
% class_name (может быть любым); суперклассы и атрибуты
% класса не указаны (так как здесь они – по умолчанию).
... % Здесь должен быть содержательный код блока classdef.
end % Конец блокаclassdef.
Одна или более явно модифицируемые (по отношению к значениям по умолчанию) величины атрибутов перечисляютсявместе с именами этих атрибутов, например:
classdef (attribute1 = value,...)… % Здесь attribute1 –
% любое регламентированное имя первого атрибута,value–
% новаявеличина первого атрибута и т.д.
... % Содержательный код блока classdef.
end
Смотрите раздел Class Attributes(Атрибуты класса), содержащий список атрибутов и их влияние на поведение (состояние) класса.
Specifying Superclasses(Спецификация суперклассов)
Определение класса в терминах одного или более других классов (суперклассов) посредством их спецификации в строке classdefимеет вид (пример для одного суперкласса):
classdef class_name < superclass_name % Здесь
%superclass_name– конкретное имя суперкласса, из
% которого выводится подкласс с именем class_name.
... % Содержание блока classdef.
end
Смотрите раздел Creating Subclasses — Syntax and Techniques(Создание подклассов – синтаксис и техника) для более подробной информации.
Specifying Properties(Спецификация свойств)
Вы можете контролировать определения свойств следующим образом:
Спецификацией начального значения для каждого свойства индивидуально;
Назначением атрибутов спецификации для всего блока свойств;
Определением методов, которые исполняются, когда характеристики свойства устанавливаются или запрашиваются.
Defining an Initial Value(Определение начальной величины)
В пределах блока свойств вы можете контролировать их индивидуальные начальные величины. Начальные величины могут быть постоянными значениями или MATLAB-выражениями. Выражения не могут ссылаться на переменные. Например:
classdefclass_name
properties % Начало блока свойств – пример, когда список и
% значения атрибутов – по умолчанию)
PropertyName % Определение любого имени первого
% свойства (назначения ему начальной величины нет,
% в этом случае они известны по умолчанию).
PropertyName = 'some text'; % Здесь some text –
% значение второго свойства с любым именем
% PropertyName, отличным от предыдущего.
PropertyName=sin(pi/12); % Выражение
% sin(pi/12) не содержит каких-либо переменных и
% вычисляет начальную величину третьего свойства с
% любым уникальным именем PropertyName, отличным
% от двух предыдущих.
end % Конец блока свойств.
end % Конец блокаclassdef.
Расчет начальных величин производится только один раз, когда класс впервые используется. Значения свойств, которые не специфицированы, по умолчанию являются пустыми множествами -[ ].
Property Attributes(Атрибуты свойств)
Все свойства имеют атрибуты, которые задают определенные аспекты поведения (состояния) свойств. Список атрибутов и их значения по умолчанию регламентированы. Атрибуты относятсяко всемсвойствам в данном блоке свойств. Например:
classdefclass_name
properties % Все не указанные здесь атрибуты известны,
% имеют значения по умолчанию и относятся ко всем % свойствам этого блока properties.
PropertyName% Нет специального назначения (установка
% идет по умолчанию) начальной величины первого % свойства данного блока properties.
PropertyName=sin(pi/12);% Выражение рассчитывает
% начальную величину второго свойства данного блока
% properties.
end % Конец первого блока свойств.
properties (SetAcess = private, GetAcess = private) % В строке properties: SetAcess – имя атрибута
% установки,private – значение этого атрибута;GetAcess–
% имя атрибута запроса на значения свойств данного (второго)
% блока properties.
Stress % Первое свойство второго блокаproperties
% (значение – по умолчанию).
Strain % Второе свойство второго блокаproperties
% (значение – по умолчанию).
end % Конец второго блока свойств.
end % Конец блока classdef.
В приведенном примере оба свойства StressиStrain, не имеющие назначенных величин (по умолчанию – [ ]), могут быть установлены (модифицированы) только объектами и методами того класса (в данном случаеclass_name), в котором определен данный блокproperties, так как атрибут установки (SetAcess) имеет значениеprivate.
Раздел Specifying Property Attributes(Спецификация атрибутов свойств) дает описание атрибутов свойств.
Property Access Methods (Методы доступа к свойствам)
Вы можете определить метод доступа на установку, который, если он вызывается, задает значение свойства, или метод доступа на запрос, который при вызове запрашивает значение свойства. Эти методы можно определить в отдельном блоке methods, не содержащем атрибутов, например:
мethods % Начало блока методов доступа класса.
function value = get.PropertyName(object)
% Кодовое словоfunction– начало функции
% get.PropertyName, определяющей метод доступа объекта
% objectпри запросезначения свойстваPropertyName;
% запрашиваемая величина возвращается в точку вызова в
% виде переменной value.
... % Рабочие операторы метода get.PropertyName.
end % Конец функции-методаget.PropertyName.
function obj = set.PropertyName(obj,value) % Функция set.PropertyName определяет метод
% доступа объекта objна установкузначенияvalueсвойства
% PropertyName; в точку вызова возвращается объект obj
% с новыми установленными параметрами.
... % Рабочие операторы метода set.PropertyName.
end % Конец функции-методаset.PropertyName.
end % Конец блока методов.
Более полная информация о методах доступа содержится в разделе Property Access Methods(Методы доступа к свойствам – см.Controlling Property Access в разделе Properties — Storing Class Data).
О свойствах смотрите в разделе Defining Properties (Определение свойств).
Specifying Methods (Спецификация методов)
Определяйте методы как обычные MATLAB-функции в блоках methods classdef-модуля. Главный метод (конструктор-метод) имеет то же самое имя, что и класс, и возвращает созданный объект. Назначение величин свойствам этого объекта может быть сделано в этом же конструктор-методе. Все функции методов завершаются ключевым словомend:
classdef class_name
methods
function obj = class_name(arg1,arg2,...) % Этот
% метод - конструктор объекта obj, использующий
% входные аргументы arg1,arg2,...:
obj.Prop1 = arg1;% Задание величиныarg1
% свойству Prop1созданного объектаobj.
... % Остальной код конструктор-метода.
end
function normal_method(obj,arg2,...)
%normal_method- обычный (не статический) метод
% класса, используемый объектом objдля обработки
% аргументов arg2,... .
... % Строки исполнительного кода метода.
end
end % Конец первого блока методов.
methods (Static = true)% Второй блок методов - с
% атрибутом Static, имеющим значение true (да,
% истина).
function static_method(arg1,...) % Статический
% метод – определен только для класса(не для его
% конкретных представителей), поэтому не требуетв списке
% входных аргументов имя объекта - obj.
... % Строки исполнительного кода метода.
end
end % Конец последнего блока методов.
end % Конец блокаclassdef.
Аргумент Staticв последнем блоке описан в подразделеStatic Methods(Статические методы) разделаMethods — Defining Class Operations(Методы – определение операций класса).
Methods In Separate Files (Методы в выделенных файлах)
Для задания метода, изолированного в отдельном M-файле @-директории (символы @ и@эквивалентны и определяются шрифтом), определите функцию-метод в этом файле, но не используйте блокmethods в нем. НазовитеM-файл такого метода именем этой функции, как обычно.
Если вы хотите специфицироватьатрибутыдля изолированногометода(проблема заключается в том, что файл изолированного метода не содержит блокаmethods, где, собственно, и устанавливаютсяатрибуты метода), вы должны включитьсигнатуру (ключевые словаmethodsиend) метода в блок classdef. Для примера следующий код показывает установку атрибутаAccess(Доступ) методаmyFuncкакprivateв субблокеmethodsблокаclassdef, но сам метод определен в отдельном файле.Не включайте связную группу ключевых словfunction-endв такой блок методов:
classdef class_name
methods (Access = private) % Начало сигнатуры метода.
output = myFunc(obj,arg1,arg2) % Вызов функции
%myFuncизолированного метода класса для объекта
% objпри обработке данныхarg1,arg2; результат
% обработки возвращается переменной output.
end % Конец сигнатуры метода.
... % Последующее содержание блока classdef.
end % Конец блокаclassdef.
В файле myFunc.m, расположенном на @-директории данного класса (после файла определения класса), для рассматриваемого примера задайте функцию-метод, как было сказано, без ключевого словаmethods:
function output = myFunc(obj,arg1,arg2)
... % Содержание функции-методаmyFunc.
end
Отметим еще раз, что включать сигнатуру метода в блок classdefнужно только в том случае, еслипотребуетсяявно специфицировать атрибуты для такого (изолированного) метода.
Defining Private Methods(Определение приватных методов)
Используйте атрибут доступа Accessдля создания приватного метода. В этом случае вам не нужно для защиты кода от внешнего воздействия создаватьприватную директорию.
Смотрите раздел Method Attributes(Атрибуты методов) для ознакомления со списком регламентированных атрибутов методов.
More Detailed Information On Methods (Более подробная информация о методах)
Смотрите раздел Class Methods(Методы классов) для более подробного знакомства с методами.
Specifying Events and Listeners(Спецификация событий и слушателей)
Чтобы определить свое (user-defined) событие, вы просто декларируете его имя (name) в блоке событийevents. Затем один из методов класса - метод извещенияnotify, который наследован из класса handle(абстрактный класс, который сам непосредственно не создает объекты и из которого выводятся конкретные классы – подклассы), запускает событие. Только классы (handle-классы),выведенные из классаhandleили его последующих производных форм,могутопределять события. Например, нижеследующий класс class_name:
Определяет user-defined-событие, названноеStateChange;
Запускает событие, используя унаследованный метод notify:
classdef class_name < handle % Здесь class_name –
% подкласс (handle-класс) суперклассаhandle.
events% Начало блока событий.
StateChange% Имя определяемого события (для
% изменения состояния некоторого объекта).
end % Конец блока событий.
... % Последующее содержание блока classdef.
methods % Начало блока методов.
functionupDataGUI(obj)% Начало определения
% метода, принимающего объект obj и производящего
% с ним некоторые действия.
... % Исполнительный код функции-метода.
notify(obj,'StateChange'); % Оператор
% извещения о событии изменения состояния (из-за
% действий метода upDataGUI) объектаobj;
% метод notifyне определяется в данном блоке
% classdef, так как унаследован от суперкласса
% handle.
end % Конец определения функции-метода.
end % Конец блока методов.
end % Конец блокаclassdef.
Listening for the Event (Восприятие события)
Любое число объектов может быть приемниками-слушателями (listeners) событий. Для выполнения некоторых действий по событиям (при наличии сообщенияnotify)служат специальные функции вызова (callbacks), которым посылается метка (handle) объекта, генерирующего событие, и особые информационные данные о событии. Слушатели и ихcallback-функции (listener callbacks)заранеерегистрируются (создаются). Для создания слушателя и егоcallback-функции (фактическиcallback-функция и есть слушатель-listener)на времясуществованияобъекта - генератора события используется методaddlistener(добавить слушателя) класса handle.
Смотрите раздел Defining Events and Listeners — Syntax and Techniques(Определение событий и слушателей – синтаксис и техника).
Specifying Attributes(Спецификация атрибутов)
Для просмотра атрибутов классов, свойств, методов и событий смотрите раздел Attribute Tables(Таблицы атрибутов).
Атрибуты определяют поведение (состояние) классов и их компонентов (свойств, методов и событий). Атрибуты позволяют вам задавать нужные характеристики поведения без написания сложных кодов. Например, вы можете создать только читаемое свойство установкой его атрибута SetAccess(Доступ на установку) вprivate (конфиденциальный), оставив атрибутGetAccess(Доступ на запрос) какpublic(свободный доступ, по умолчанию):
properties (SetAcess = private) % Значения свойств этого
% блокане могут быть заданы извнекласса и его инстанций-
% объектов.
ScreenSize = getScreenSize;% Установка величины
% getScreenSizeдля свойства ScreenSize.
end
Все блоки определения класса (classdef, properties, methods и events) поддерживают регламентированные атрибуты спецификации, каждый из которых имеет значение по умолчанию. Вам необходимо самим специфицировать величины атрибутовтольков случае, если вы хотитеизменитьэти значения.
Attribute Descriptions(Описания атрибутов)
Список поддерживаемых атрибутов смотри в разделах:
Class Attributes(Атрибуты класса);
Specifying Property Attributes(Спецификация атрибутов свойств);
Method Attributes(Атрибуты методов);
Event Attributes(Атрибуты событий).
Specifying Attribute Values(Спецификация значений атрибутов)
Когда вы специфицируете значения атрибутов, все компоненты, содержащиеся внутри определяемого блока, поддерживают только эту спецификацию. Например, рассмотрим следующие наборы атрибутов свойств:
Атрибут SetObservableсвойстваAccountBalanceестьtrue (истина, да);
Атрибут HiddenсвойствSSNumberиCreditCardNumberестьtrue, а их атрибутSetAccess–private.
Следуя вышесказанному, ясно, что определения с разными установкамиатрибутов спецификации требуютразных блоков. Пример для предыдущих наборов атрибутов свойств имеем:
properties (SetObservable = true)
AccountBalance
end
properties (SetAccess = private, Hidden = true)
SSNumber
CreditCardNumber
end
Последовательность нескольких атрибутов специфицируется через запятые, как показано в последнем properties-блоке.
Атрибуты блока располагаются сразу после его ключевого слова, например:
classdef (Sealed = true,…) myclass
...
end
Simpler Syntax for true/false Attributes (Упрощенный синтаксис для значений true/false атрибутов)
Все атрибуты, значения которых могут быть trueилиfalse (ложь), по умолчанию являютсяfalse. Вы можете использовать упрощенный синтаксис для таких атрибутов: одно имя атрибута соответствует установке вtrue, а добавление к нему отрицания «~» –false. Например:
methods (Static)
...
end
есть то же самое, что и
methods (Static = true)
...
end
Для определения того же метода как falseдобавим оператор «~»:
methods (~Static)
...
end
Последнее есть то же самое, что и
methods (Static = false)
...
end
Sample Class Syntax (Пример синтаксиса класса)
Следующий код показывает синтаксис типового определения класса; оно не является функциональным, так как его ссылки (вызовы) не могут быть выполнены. Цель этой части – иллюстрация вариантов синтаксических конструкций:
classdef (ConstructOnLoad) employee < handle
% Classhelpgoeshere(Здесь пояснение для класса): атрибут
% ConstructOnLoad– регламентированный, устанавливается как
% «истина»; employee– имя создаваемогоuser-defined-класса
% (подкласса); handle– регламентированный абстрактный
% суперкласс.
properties % Атрибуты и их значения – по умолчанию.
Name %Propertyhelpgoeshere(Здесь пояснение для свойства):
% назначение user-defined-свойства Nameс установкой
% его величины по умолчанию (пусто).
end
properties (Dependent)% Регламентированный атрибут
% Dependentустанавливается как «истина», остальные
% атрибуты – по умолчанию.
JobTitle %User-defined-свойство с величиной «пусто» по
% умолчанию.
end
properties (Transient)% Регламентированный атрибут
% Transientустанавливается как «истина», остальные
% атрибуты – по умолчанию.
OfficeNumber %User-defined-свойство с величиной «пусто»
% по умолчанию.
end
properties (SetAccess = protected,...
GetAccess = private)% Назначение величин
% двум регламентированным атрибутам, остальные
% атрибуты – по умолчанию.
EmpNumber %User-defined-свойство без величины (пусто).
end
events % Атрибуты и их значения – по умолчанию.
BackgroundAlert % User-defined-событие (пусто).
end
methods % Атрибуты и их значения – по умолчанию.
function Eobj = employee(name)%Methodhelphere% (Здесь пояснение для метода) : конструктор объектов
% класса employee.
Eobj.Name = name;% Назначение величины name
% свойству NameобъектаEobj.
Eobj.EmpNumber = ...
employee.getEmpNumber;% Назначение
% величины, взятой из свойства getEmpNumberкласса
% employee, свойству EmpNumber объекта Eobj.
end
function result = backgroundCheck(obj) % Функция-
% метод для объектаobj.
result = ...
queryGovDB(obj.Name,obj.SSNumber);% Вызов
% методаqueryGovDB, использующего свойства
% NameиSSNumberобъектаobj.
if result == false % Проверка значения result
% для определения порядка действий.
notify(obj,'BackgroundAlert');% notify–
% регламентированное сообщение (запуск
% события) о событии ВackgroundAlertв объекте
% obj – источнике события.
end
end
function jobt = get.JobTitle(obj) % Функция-метод
% (запроса величины свойстваJobTitleобъекта obj)
% переопределяет стандартную функциюget.
jobt = currentJT(obj.EmpNumber);% Вызов
% метода currentJT, использующего величину
% свойства EmpNumberобъектаobj.
end
function set.OfficeNumber(obj,setvalue)
% Функция-метод set.OfficeNumber(установки
% величины свойства OfficeNumberобъектаobj)
% переопределяет стандартную функцию set; для установки
% используется параметр setvalue.
if isInUse(setvalue)% Вызов методаisInUse
% для проверки годности аргумента setvalueс
% целью определения порядка действий.
error('Not available')% Вызов функцииerror
% для вывода сообщения «Не пригоден».
else
obj.OfficeNumber = setvalue;% Назначение
% величины setvalue свойству
% OfficeNumber объекта obj.
end
end
end
methods (Static)% Установка значения регламентированного
% атрибута Staticкак «истина», остальные атрибуты – по
% умолчанию.
function num = get.EmpNumber % Переопределение
% стандартной функции getдля запроса величины свойства
% EmpNumber.
num = queryDB('LastEmpNumber') + 1;% Расчет
% numкак суммы результата метода queryDBи
% единицы.
end
end
end
Functions Used with Objects (Функции, используемые с объектами)
MATLABимеет следующие стандартные функции для работы с объектами:
Функция |
Цель |
class
|
Возвращает класс объекта |
events
|
Отображает на экране имена событий класса |
isa
|
Определяет, действительно ли аргумент есть объект некоторого класса
|
isobject
|
Определяет, действительно ли вход есть MATLAB-объект |
methods
|
Информация о методах класса |
methodsview
|
Информация о методах класса в выделенном окне |
properties
|
Отображает на экране имена свойств класса |
Developing Classes — Typical Workflow(Создание классов – типовой рабочий процесс)
В этом разделе: |
Formulating a Class (Формулирование класса);
Implementing the BankAccount Class (Исполнение класса BankAccount);
Implementing the AccountManager Class (Исполнение класса AccountManager);
Using the BankAccount Class (Использование класса BankAccount).
|
Formulating a Class (Формулирование класса)
В данном примере излагаются разработка и исполнение простого handle-класса (копии любого объекта такого класса ссылаются на одно и то же множество исходных данных). Для создания класса, который представляет собой некоторый банк счетов, вначале определите элементы данных и операции, выполняемые вашим классом. Например, банковский счет имеет:
Номер;
Баланс;
Текущий статус (открыт, закрыт и т.д.).
Вам необходимо определить операции с банковским счетом, такие как:
Пополнение счета;
Снятие средств.
Вы можете также захотеть, чтобы банк посылал извещение в случае, если баланс окажется слишком малым, и при этом будет делаться попытка снятия со счета. Когда такое событие произойдет, банк может послать уведомление; при этом сущности, которые предназначены для приема этой информации, такие как слушатели в программе управления счетами, могут быть активизированы (например, для изменения статуса счета). В результате статус всех банковских счетов может определяться автономнойпрограммой-менеджером, которая контролирует балансы и назначает счетам, например, одно из трех значений:
open (открыт) - баланс положителен;
overdrawn(превышение) - превышение отрицательного баланса в пределах $200;
closed(закрыт) - отрицательный баланс превышает порог $200.
Ранее было сказано, что в классах данные хранятся в свойствах, операции выполняются методами, а извещения о событиях поддерживаются слушателями. Поэтому классу банковских счетов необходимы аналогичные компоненты, рассмотренные в последующих разделах.
Defining Class Data (Определение данных класса)
Классу необходимо определить свойства для хранения данных – номера счета, его баланса и статуса:
AccountNumber(Номер счета) – этому свойству дают значение при создании объект-инстанции класса (открытие счета);
AccountBalance(Баланс счета) – это свойство модифицируется операциями класса (пополнение счета и снятие средств с него);
AccountStatus(Статус счета) – это свойство устанавливается в начальное значение, когда создается инстанция класса. Оно изменяется методами другого класса (AccountManager-Менеджер счета) каждый раз, когда величина свойстваAccountBalanceсчета падает ниже нуля.
Первые два свойства содержат информацию, изменить которую могут только сам класс банковских счетов и его инстанции-объекты, поэтому атрибут SetAccessэтих свойств должен быть установлен вprivate. Величина дляAccountStatusопределяется внешней программой AccountManager, которой необходим доступ к этому свойству класса банковских счетов, поэтому атрибутSetAccessданного свойства должен остаться по умолчанию –public(свободный доступ).
Defining Class Operations(Определение операций класса)
Класс должен создать счет, позволить вложить средства в него и снять их со счета. Поэтому потребуется три метода класса:
deposit(вложение) – обновляет свойствоAccountBalance, когда осуществляется пополнение счета;
withdraw(снятие средств) – обновляет свойствоAccountBalance, когда осуществляется изъятие средств со счета;
BankAccount(Банковский счет) – конструктор-метод, создает текущий счет для очередного клиента.
Defining Class Events(Определение событий класса)
Банковские счета с отрицательным балансом имеют статусы, изменяемые внешней программой менеджера, как указано выше. Для исполнения этой активности класс BankAccount стимулирует событиеInsufficientsFunds(Неудовлетворительные счета), когда его методwithdraw (снятие средств со счета) приводит к отрицательному балансу. Поэтому возбуждение событийInsufficientsFundsосуществляется внутри данного методаwithdraw.
Для определения user-defined-события вы просто указываете имя внутри блока событий events. Событие стимулируется путем вызова унаследованного подклассомBankAccount метода notifyсуперкласса handle. Заметим, что в данном случае (user-defined-событие) имя события не является регламентированным - вы можете именовать его любой строкой и при возникновении события реализовать его теми действиями, которые выберете.
Implementing the BankAccount Class (Исполнение класса BankAccount)
В рассматриваемом классе, как и для других классов, в любом свойстве определяется только одно множество данных (контейнер данных) для всехинстанций классаBankAccount. Вы, вероятно, не захотите также оперироватьнезависимымикопиями какого-либо объекта-счета, чтобы в разных ситуациях работать только с исходным множеством данных этого счета. Поэтому класс BankAccountдолжен быть исполнен какhandle-класс (класс, выведенный из суперкласса handle или его подкласса). Все копии любого его объекта (handle-объекта) будут обращаться только кодномуи тому жемножеству данных исходного счета.
Display Fully Commented Example Code(Отображение полностью комментированного примера кода)
Вы можете отобразить код для данного примера на временном окне, который содержит детальный комментарий и связи с родственными подразделами документации, щелкнув ссылки:
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отрицательный:
ifnewbal < 0
% то посредством метода notifyсообщается о
% событии InsufficientFundsв объектеBA:
notify(BA,'InsufficientFunds')% Сообщение о % событииInsufficientFundsдля слушателя,
% зарегистрированного ранее вместе с его callback-
% функцией реагирования (см. выше команду
% AccountManager.addAccount).
end
end % withdraw
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в последнем коде можно опустить.
Using the BankAccount Class (Использование классаBankAccount)
Класс BankAccount, хотя и является простым классом, демонстрирует общее поведениеMATLAB-классов. Например, создадимBankAccount-объект с очередным номером1234567 и начальным депозитом $500; для этого наберем в командном окне:
BA = BankAccount(1234567,500);
В соответствии с этим выражением MATLABвызовет функциюBankAccount, которая, будучи найденной, окажется конструктор-методомBankAccount(AccountNumber, InitialBalance) BankAccount-объекта, куда поступят фактические числа 1234567, 500 на место соответствующих входных аргументовAccountNumberиInitialBalance. По ним далее будут установлены значения свойствBA.AccountNumberиBA.AccountBalancehandle-объекта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классаAccountManagercallback-функцияassignStatusбудет вызвана с фактическим параметромsrc(источник события) =BA(объект, где событие активизировано). Первыйifв теле этойcallback-функции подтвердит наличие отрицательного баланса, второйifопределит, чтоперерасходаотносительно границы $200 нет, поэтому далее будет сформировано значениеoverdrawnдля свойстваAccountStatus.
Новое обращение:
BA.AccountStatus
отразит текущее значение свойства AccountStatusобъектаBA:
ans =
overdrawn
Сделаем дополнительный съем средств:
BA.withdraw(200)
Как и в предыдущих случаях, находим, что сообщения о закрытии счета снова не будет (в операторе 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 % Ответ
Using Objects to Write Data to a File(Использование объектов для записи данных в файл)
В этом разделе: |
Flexible Workflow(Гибкий рабочий процесс);
Performing a Task with an Object (Выполнение задачи с объектом);
Using Objects in Functions(Использование объектов в функциях).
|
Flexible Workflow(Гибкий рабочий процесс)
Язык MATLABне требует от вас определения классов для всех кодов, которые вы пишете. Вы можете использовать объектывместе с обычнымифункциями. Этот раздел иллюстрирует использование объекта (который выполняет обобщенную задачунаписания текста в файл) в функциидля написания конкретного тексташаблонаопределения класса.
Performing a Task with an Object (Выполнение задачи с объектом)
Одним из преимуществ определения класса по сравнению с обычной функцией для выполнения задачи является то, что класс обеспечивает лучший контроль за связанными данными. Например, рассмотрим задачу занесения данных в файл. Она включает следующие шаги:
Открытие файла для определения и сохранения его идентификатора;
Использование идентификатора файла для внесения данных в файл;
Использование идентификатора файла для закрытия файла.
The Filewriter Class (Класс Filewriter)
Следующее простое определение класса иллюстрирует, как вы можете создать класс для написания текста в файл. Оно показывает, как можно использовать преимущества класса за счет:
Сокрытия приватных данных – клиенту, вызывающему файл, не нужно управлять идентификатором файла;
Гарантии того, что используется всегда только один идентификатор файла класса - копии handle-объектов обращаются к одному и тому же оригиналу;
Обеспечения автоматического закрытия файла, когда рабочий объект уничтожается – специальный объектный метод берет на себя эту задачу без явного вызова.
Этот класс (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 до того, как
% объект objбудет уничтожен:
function delete(obj)% Переопределение стандартной
% функции delete.
fclose(obj.FileID);% Закрытие файла с
% идентификатором, взятым из FileID.После этого
% объект obj автоматическиуничтожается.
end
end%methods
end % classdef
Using a Filewriter Object (Использование Filewriter-объекта)
Заметим, что пользователь сначала называет имя файла для создания Filewriter-объекта и затем использует методwriteToFile классаFilewriterдля написания одной строки текста в файл. В следующем коде первая строка создаетFilewriter-объектfwдля файлаmynewclass.mи сам файлmynewclass.m (посредством стандартной функцииfopen, так как этот файл ранее не был образован), а вторая строка пишет текст в созданный файл. Команда «clear fw» ликвидируетFilewriter-объект, чтоавтоматическиприводит к вызовуего собственногоdelete-метода и соответственно к закрытию (fclose) файла:
>> fw = Filewriter('mynewclass.m');% Создание
% Filewriter-объектаfwдля файлаmynewclass.m.
>> fw.writeToFile('classdef mynewclass < ... handle')% Вызов методаwriteToFileкласса
% Filewriter; здесь, в отличие от обычного вызова
% для writeToFile(obj,text_str), фактическое значение
% параметра objберется из самой команды какfw.
>> clear fw % Освобождение рабочей памяти отfw, при этом
% автоматическивызываетсяdelete-метод класса
% Filewriterдля его представителя – объектаfw.
Для проверки результата запросим содержание нашего файла mynewclass.m:
>> type mynewclass
Поскольку в файле mynewclass.m нет других элементов (он впервые создан при образовании объектаfw),MATLABвыдаст записанный текст (см. функциюfprintfв методеwriteToFile):
classdef mynewclass < handle
Using Objects in Functions (Использование объектов в функциях)
Filewriter-объекты обеспечивают качество, которое вы можете использовать в функциях и других классах. Ниже дан пример функцииwriteClassFileдля формирования текстового трафарета блока classdef.
Этот пример создает трафарет файла для относительно простого класса classname(другая версия может использовать более сложные варианты по аналогии с представленным):
function writeClassFile(classname,superclass)% Функция % создания трафарета определения классаclassnameи записи его
% в файл; для внесения текста трафарета в файл используйте
% Filewriter-объект:
fw = Filewriter([classname '.m']);% Вызов конструктора
% Filewriter-объектов (см. выше определение класса
% Filewriter); символы «.m» -расширение для файла; скобки
% []- конкатенация (объединение) имени класса и его расширения;
% [classname '.m'])дает имяclassname.mфайла для
% Filewriter-конструктора; конструктор также вычислит (функция
% fopen) и сохранит в свойствеFileIDобъектаobj
% идентификатор файла; объект objконструкторомFilewriter
% будет назначен переменной fw (она станетhandle-копией
%Filewriter-объектаobj). Если число входных аргументов функции
% writeClassFileбольше 1:
if nargin > 1
% то внесем в файл текст по методуwriteToFileобъекта
% obj = fw класса Filewriter:
fw.writeToFile(['classdef ' classname ' < '...
superclass]) % Вызов метода writeToFile (см. выше
% определение классаFilewriter); фактическое
% значение для входного аргумента objфункции-метода
% writeToFileбудет взято какfwиз команды
%fw.writeToFile. Еслиnargin не окажется больше 1, то:
else % иначе:
% строка classdefтрафарета будет другой (без
% суперкласса):
fw.writeToFile(['classdef ' classname])
end
% Остальные компоненты блока classdef:
fw.writeToFile(' properties ')% Начало блока свойств.
fw.writeToFile(' ')% Пустая строка свойств трафарета, которая
% будет использована при создании конкретного класса.
fw.writeToFile(' end % properties') % Конец блока
% свойств.
fw.writeToFile(' ')% Пустая разделительная строка пробелов.
fw.writeToFile(' methods ')% Начало блока методов.
fw.writeToFile([' function obj =...
' classname '()'])% Начало функции-конструктора
% объектов класса classname.
fw.writeToFile(' ')% Строка для будущего кода конструктора.
fw.writeToFile(' end')% Конец метода-
% конструктора.
fw.writeToFile(' end%methods')% Конец блока
% methods
fw.writeToFile('end % classdef') % Конец блока
% classdef.
delete(fw) % Закрытие файла класса classname (см. функцию
% fcloseвdelete-методе класса Filewriter) с последующим
% уничтожением объекта fw.
end % Конец функцииwriteClassFile.
Для создания конкретного трафарета определения класса вызовите функцию writeClassFileс именами вашего класса и (при необходимости) его суперкласса. Используйте стандартную командуtypeдля вывода содержания файла трафарета на экран. Например:
>> writeClassFile('myNewClass','handle') % Создание
% трафарета определения класса myNewClass.
>> type myNewClass % Вызов содержания файла трафарета.
Результат последнего вызова:
classdef myNewClass < handle
properties
end % properties
methods
function obj = myNewClass()
end
end % methods
end % classdef
More Information on These Techniques (Дополнительная информация по этой технике)
Разделы с дополнительной информацией по определению и уничтожению классов:
The Handle Base Class (Базовый класс handle);
Handle Class Delete Methods (Delete-методы handle-классов).
Using the Editor and Debugger with Classes(Использование редактора и отладчика с классами)
В этом разделе: |
Referring to Class Files (Ссылка на файлы классов).
|
Referring to Class Files (Ссылка на файлы классов)
Классы определены в M-файлах так же, как сценарии и функции. Чтобы использовать редактор и отладчик с файлом класса, вы должны использовать полное имя класса. Например, пусть М-файлmyclass.mдля класса имеет следующее размещение (знак «+» указывает на пакеты файлов):
+PackDir1/+PackDir2/@myclass/myclass.m
Для открытия файла myclass.mв редактореMATLABвы можете указать на файл, используяdot-разделение (разделение точками) имен пакетов:
edit PackDir1.PackDir2.myclass
Вы можете также использовать path-нотацию (нотацию пути – «/»):
edit +PackDir1/+PackDir2/@myclass/myclass
Если файл myclass.mне расположен в @-директории, вы можете набрать (пример для файлаmyclass.m, расположенного после+PackDir2):
edit +PackDir1/+PackDir2/myclass
Для ссылки к функциям (например, packFunction) внутри пакета директорий вы можете использоватьdot- илиpath-разделители:
edit PackDir1.PackDir2.packFunction
edit +PackDir1/+PackDir2/packFunction
Для указания на метод (например, myMethod), определенный в егособственномМ-файле внутри @-директории, вы можете использовать следующее:
edit +PackDir1/+PackDir2/@myclass/myMethod
Debugging Class Files(Отладка файлов класса)
Для отладки файлов определения класса стандартная функция dbstop(установка точек прерывания) принимает любую спецификацию файла, используемую с командойedit(редактирование или создание файла).
Modifying Classes(Модификация классов)
Если вы модифицируете определение класса (т.е. меняете атрибуты или спецификации блоков classdef,properties,methodsилиevents), эти изменения могут влиять не тотчас, если это не инстанции класса.MATLABне использует модифицированный класс до тех пор, пока существует хотя бы одна инстанция предыдущего определения. Он продолжает использовать прежнее определение, пока все инстанции не обнулятся.
Можно использовать стандартную команду clearс указанием на классы:
clear classes
чтобы очистить текущую (используемую в данный момент) рабочую область памяти от всех переменных, сбросить всефункции(которые могут иметь постоянные переменные, удерживаемые инстанциями класса) и обнулить всеклассы, которые не имеютинстанций вне рабочей области.
Однако вам не требуетсявводить командуclear classes послеизменениякода в определениях функцийвнутриметодов.MATLABреализует измененный метод при любом его следующем вызове.
Compatibility with Previous Versions(Совместимость с предыдущими версиями)
В этом разделе : |
New Class-Definition Syntax Introduced with MATLAB Software Version 7.6(Новый синтаксис определения класса, введенный в версиюMATLAB 7.6);
Changes to Class Constructors(Изменения к класс-конструкторам);
|
В этом разделе (окончание): |
New Features Introduced with Version 7.6(Новые характеристики, введенные в версию 7.6);
Examples of Old and New (Примеры старого и нового). |
New Class-Definition Syntax Introduced with MATLAB Software Version 7.6 (Новый синтаксис определения класса, введенный в версию MATLAB7.6)
Версия MATLAB7.6 вводит новый синтаксис для определения класса. Этот новый синтаксис дополняется следующим:
Ключевое слово classdefначинает блок определения класса, который заканчивается словомend;
Внутри блока classdefсловаproperties,methodsиeventsявляются также ключевыми ограничителями, где вы определяете соответствующие компоненты класса.
Cannot Mix Class Hierarchy(Нельзя нарушать иерархию классов)
Нельзя создавать иерархии классов, которые смешивают классы, определенные раньше версии 7.6, и текущих определений (т.е. использующих classdef). Поэтому вы не можете создавать новую версию подкласса из старого класса.
Only One @-Directory per Class(Только одна @-директория на класс)
Для класса, определенного с использованием нового ключевого слова classdef, @-директория включает все участки, которые встречаютсяпосленеё до конца директории. Класс, расположенный на @-директории, должен размещатьвсесвои файлы в этой единственной директории. При этом классы, определенные в @-директориях, продолжают обладатьпреимущественнымприоритетом над функциями и сценариями с такими же именами, даже если последние расположены раньше на пути.
Private Methods(Приватные методы)
Вам нет необходимости определять приватные директории классов для версии 7.6. Вы можете просто установить приватные (private) атрибуты доступа (Access) для метода.
Changes to Class Constructors(Изменения к класс-конструкторам)
Методы класс-конструкторов для версии 7.6 имеют две главные особенности:
Функция classне используется;
Они должны вызывать конструктор суперкласса, только если вам нужно послать аргументы к этому конструктору. Другими словами, вызов суперкласс-конструктора не является обязательным.
Examples of Old and New Syntax(Примеры старого и нового синтаксисов)
Сравните следующие два Stock-конструктора. КлассStockявляется инстанцией классаAsset, который требует аргументы для своего конструктора.
Constructor Function Prior to Version 7.6 (Функция-конструктор до версии 7.6):
function s = Stock(description, num_shares,...
share_price)
s.NumShares = num_shares;
s.SharePrice = share_price;
% Конструктор Asset-объекта:
a = Asset(description,'stock',share_price*...
num_shares);
% Используйте стандартную функцию classдля определенияStock- % объекта:
s = class(s,'Stock',a);
Для версии 7.6 тот же самый класс-конструктор Stockбудет записан по-другому, как показано ниже. Наследуемость будет определена наclassdef-линии и конструктор будет определен внутри блокаmethods.
Constructor Function for Version 7.6 (Функция-конструктор для версии 7.6):
classdef Stock < Asset
...
methods
function s = Stock(description,...
num_shares,share_price)
% Вызовите суперкласс-конструктор для посылки в него % аргументов. Это даст суперкласс-частьсоздаваемого
% объекта s:
s = s@Asset(description,'stock',...
share_price*num_shares);
s.NumShares = num_shares; % Первое
% дополнение к суперкласс-части объектаs-
% автоматическоерасширение свойств относительно
% суперкласс-части.
s.SharePrice = share_price;% Второе
% дополнение к суперкласс-части объекта s.
end% Конец функции.
end% Конец блокаmethods.
end% Конец блокаclassdef.
New Features Introduced with Version 7.6(Новые характеристики, введенные в версию 7.6)
Новые характеристики для версии 7.6 относятся к следующим основополагающим понятиям:
Properties(Свойства):How to Use Properties (Как использовать свойства);
Handle classes (Handle-классы): Comparing Handle and Value Classes (Сравнение handle- и value-классов);
Events and listeners (События и слушатели): Events and Listeners — Concepts (События и слушатели – концепты);
Class member attributes (Атрибуты компонентов класса): Attribute Tables (Таблицы атрибутов);
Abstract classes (Абстрактные классы): Abstract Classes and Interfaces (Абстрактные классы и интерфейсы);
Dynamic properties (Динамические свойства): Dynamic Properties — Adding Properties to an Instance (Динамические свойства – добавление свойств к инстанции);
Ability to subclass MATLAB built-in classes (Способность иметь подклассы встроенных MATLAB-классов): Creating Subclasses — Syntax and Techniques (Создание подклассов – синтаксис и техника);
Packages for scoping functions and classes (Пакеты для ограничения сферы функций и классов): Scoping Classes with Packages (Ограничение сферы классов пакетами). Пакеты не поддерживаются для классов раньше версии 7.6 (т.е. классов, которые не используют ключевое словоclassdef).
Examples of Old and New (Примеры старого и нового)
Исполнения классов в MATLABверсии 7.6 основаны на ряде важных отличий синтаксиса от предыдущих выпусков. Тем не менее, классы, написанные в предыдущих версиях, продолжают работать в этом и будущих вариантах. Большинство кодов, которые вы использовали для создания методов, могут быть сохранены в прежнем виде, исключая те, в которых вы хотите получить преимущества от новых введенных возможностей.
Следующие разделы дают примеры определения классов для нового синтаксиса. Эти же самые классы были использованы в прежней документации MATLAB-классов и объектов и обеспечивают возможности для сравнения:
Example — A Polynomial Class (Пример – класс полиномов);
Example — A Simple Class Hierarchy (Пример – простая иерархия классов);
Example — Containing Assets into a Portfolio (Пример – содержание активов в portfolio).
Obsolete Documentation(Устаревшая документация)
Документация по MATLAB-классам и объектам до версии 7.6 пригодна для данного выпуска в рамках указанных выше ограничений.
MATLAB and Other OO Languages (MATLAB и другие ОО языки)
В этом разделе: |
Some Differences from C++ and Sun Java Code (Некоторые отличия от С++ и Sun Java кода);
Common Object-Oriented Techniques (Общая объектно-ориентированная техника). |
Some Differences from C++ and Sun Java Code (Некоторые отличия от С++ и Sun Java кода)
Если вы практиковались в программировании на объектно-ориентированных языках С++ и SunJava, то обнаружите, что программирование на языкеMATLABотличается по нескольким важным аспектам.
Public Properties(Общедоступные свойства)
В отличие от полей в языках C++ илиtheJavaвы можете использовать свойстваMATLAB-классов для определения общедоступного интерфейса отдельно от хранения данных. Вы вправе обеспечить свободный доступ к свойствам, потому что вы можете определить методыset- иget-доступа, которые выполняются автоматически, когда значения свойств соответственно устанавливаются или запрашиваются посредством внешнего (по отношению к методам объекта) кода. Например, следующий оператор
myobj.Material = 'plastic';
назначает строку plasticсвойствуMaterialобъектаmyobj. Однако прежде чем осуществить действительное назначение,myobjвызывает свой объектный метод, называемыйset.Material(предполагается, что класс объектаmyobjопределяет этот метод), который может выполнить любую операцию над данными для проверки их правильности, установит новые значения и т.д. Смотрите разделControlling Property Access(Контроль доступа к свойствам) для более подробной информации о методах доступа к свойствам.
Вы можете контролировать доступ к свойствам посредством установки атрибутов, которые разрешают общий, защищенный или приватный доступы. Смотрите в разделе Property Attributes(Атрибуты свойств) полный список свойств атрибутов.
Pass By Reference (Передача по ссылке)
В MATLAB-классах переменные не передаются ссылкой. ОднакоMATLABподдерживает два типа классов, которые ведут себя по-разному с учетомссылочных данных:value-классы (классы величин) иhandle-классы (классы имен-метокhandle).
Value-классы. Когда пишутся методыvalue-класса, которые обновляют объект, вы должнывернутьобратно обновленный объект какновыйииспользовать операторназначения для переменной, идентифицирующей новый (обновленный) объект. Например, следующее исполнение стандартной функцииsetдля свойстваPropertyName объектаAvalue-класса требует, чтобы левой переменнойAфункциейsetбыл возвращен исходный объектA(правый) как новый с величиной PropertyValue для указанного свойстваPropertyName:
A = set(A,'PropertyName',PropertyValue);
Последнее означает, что для value-класса любое изменение исходных данных приводит кновому объекту по отношению к исходному.
Handle-классы. Если естьhandle-объект, то имеетсятолько однакопия (множество)данных, поэтому установка новой величины свойства меняет именноэти данные, на которыессылаются всеhandle-копии. Таким образом,handle-класс ведет себя подобнографическомуhandle-объекту. Например, вышеуказанная установка вhandle-классе может быть заказана следующим упрощенным вариантом:
set(A,'PropertyName',PropertyValue);
Здесь оператор назначения не обязателен, так как любые переменные (в том числе и их копии) вhandle-классах, как и исходная переменнаяA, по сути идентифицируют не объекты, а данные (один и тот же контейнер данных). Если данные меняются, то ссылки на них посредствомлюбыхпеременных-копий автоматически учтут эти изменения.
Dispatching(Диспетчеризация)
В MATLAB-классах метод диспетчеризации не базируется на сигнатуре (предписании) метода, представленного в языкахC++ иJava. Когда список аргументов содержит объекты одинакового предпочтения,MATLABиспользует самый левый объект для вызова нужного метода. ОднакоMATLABможет использовать метод аргумента, расположенного на любой позиции списка, если класс этого аргумента имеет предпочтение перед классами других аргументов.
Смотрите раздел Specifying Class Precedence(Спецификация класс-предпочтения) для получения более подробной информации.
Calling Superclass Method(Обращение к методу суперкласса)
Существуют различия в вызовах методов для разных ОО языков:
В языке C++ вы вызываете метод суперкласса, используя оператор области данных: superclass::method;
В Java-коде вы используете такую форму:superclass.method.
Эквивалентная MATLAB-операция естьmethod@superclass.
Other Differences(Другие различия)
В MATLAB-классах нет эквивалента спецификатораC++ или настроек языкаJava. ОднакоMATLABслабо типизирован и позволяет написать функции и классы, которые работают с разными типами данных.
MATLAB-классыне поддерживаютперезагружаемые функции, использующиеразныесигнатуры для того же самого имени функции.
Common Object-Oriented Techniques (Общая объектно-ориентированная техника)
Следующая таблица дает связи с разделами, где обсуждаются элементы общей объектно-ориентированной техники, используемые и другими объектно-ориентированными языками.
Таблица ОО техники
Техника |
Как использовать в MATLAB |
Оператор перезагрузки |
Overloading Operators(Операторы переопределения) |
Множественная наследуемость |
Using Multiple Inheritance(Использование множественной наследуемости) |
Создание подклассов |
Creating Subclasses — Syntax and Techniques(Создание подклассов – синтаксис и техника) |
Деструктор |
Handle Class Delete Methods (Delete-методы handle-классов) |
Область данных для компонентов |
Property Attributes(Атрибуты свойств) |
Пакеты (ограничение области классов) |
Scoping Classes with Packages(Ограничение сферы классов пакетами) |
Именованные константы |
Defining Named Constants(Определение именованных констант) |
Статические компоненты |
Static Methods(Статические методы) |
Конструктор |
Class Constructor Methods (Класс-конструктор- методы) |
Конструктор копии |
Нет прямого аналога |
Ссылка/классы ссылок |
Comparing Handle and Value Classes (Сравнение handle- и value-классов) |
Абстрактный класс/интерфейс |
Abstract Classes and Interfaces (Абстрактные классы и интерфейсы) |
Сбор отходов |
Object Lifecycle(Жизненный цикл объекта) |
Свойства инстанций |
Dynamic Properties — Adding Properties to an Instance(Динамические свойства – добавление свойств к инстанции) |
Импортирование классов |
Importing Classes(Импортирование классов) |
События и слушатели |
Events and Listeners — Concepts (События и слушатели - концепты) |