циентов).
Вывод на терминал. Как правило, для удобства работы с объектами любого класса, классы имеют методы, отвечающие за вывод значения объекта или значения какого либо отдельного поля объекта на экран. (Например, метод с именем 'display' или 'disp' или 'plot') Причѐм нужно учесть ту особенность, что данный метод вызывается всякий раз, когда оказывается, что исполняемый оператор не
заканчивается ";"
Пример:
display(p) display(p); p=x^3-2*x-5
Так же нужно отметить, что аналогичный метод можно получить тремя способами:
1.Путѐм наследования метода другого существующего объекта.
2.Путѐм переопределения метода другого существующего объекта, (при наследовании и одновременной его модернизацией)
3.Путѐм непосредственного его написания.
Переопределение классов (свойство полиморфизма)
Во многих случаях можно изменить поведение операторов и функций системы MATLAB, когда в качестве аргумента выступает объект. Это осуществляется путем переопределения соответствующих функций. Переопределение класса открывает возможность обработки с помощью этой функции различных типов данных при произвольном количестве входных аргументов.
Переопределение арифметических операций и операторов. Каждый встроен-
ный оператор в системе MATLAB имеет имя. Поэтому любой оператор может быть переопределен путем создания М-файла с соответствующим названием в каталоге классов.
Переопределение операторов. Так же относиться к переопределению методов, являющихся стандартизованными в Matlab 5 и привязанных к определѐнного вида обозначению.
Следующая таблица устанавливает символьные имена для большинства встроенных операторов системы MATLAB. Символьные имена встроенных операторов системы MATLAB:
98
|
|
Таблица 5.2. Имена операторов |
|
|
|
Оператор |
Имя M-файлов |
Описание |
|
|
|
а+b |
Plus(a.b) |
Двоичное сложение |
|
|
|
а-b |
Minus (a. b) |
Двоичное вычитание |
|
|
|
-а |
uminus(a) |
Унарное вычитание |
|
|
|
+а |
Up Ins (a) |
Унарное сложение |
|
|
|
а.*b |
Times(a, b) |
Поэлементное умножение |
|
|
|
А*b |
Mtimes(.a, b.) |
Умножение матриц |
|
|
|
а./b |
Rdivide(a, b) |
Правое поэлементное деление |
|
|
|
А.\b |
Idivide(a, b) |
Левое поэлементное деление |
|
|
|
А/b |
Mrdivide(a, b) |
Правое деление матриц |
|
|
|
А\b |
mldivide(a, b) |
Левое деление матриц |
|
|
|
а.^b |
Power(a, b) |
Поэлементное возведение в степень |
|
|
|
А^b |
Mpower(a, b) |
Возведение матрицы в степень |
|
|
|
а<b |
It(a, b) |
Меньше |
|
|
|
а >b |
Gt(a, b) |
Больше |
а<=b |
Le(a, b) |
Меньше или равно |
|
|
|
а>=b |
ge(a, b) |
Больше или равно |
а~=b |
Ne(a, b) |
Неравно |
|
|
|
а=b |
Eq(a, b) |
Тождественно |
|
|
|
а&b |
And(a,b) |
Логическое И |
|
|
|
a|b |
or(a, b) |
Логическое ИЛИ |
|
|
|
~а |
Not(a, b) |
Логическое НЕ |
a:d:b a:b |
Colon(a, d, b) Co- |
Формирование вектора |
|
lon(a, b) |
|
a' |
Ctranspose(a) |
Транспонирование матрицы |
|
|
|
a.' |
Transpose(a) |
Транспонирование массива |
|
|
|
Command win- |
display (a) |
Вывод на терминал |
dow output |
|
|
[ab] |
horzcat(a, b,...) |
Объединение в строку |
|
|
|
[a;b] |
Vertcat(a, b,...) |
Объединение в столбец |
|
|
|
a(sl, s2,..,sn) |
Subsref(a, s) |
Индексная ссылка |
|
|
|
A(sl,...sn)=b |
Subsasgn(a, s, b) |
Индексная выражение |
B(a) |
Subsindex(a, b) |
Индекс подмассива |
|
|
|
99
Переопределение функций. Можно переопределить любую М-функцию, создавая функцию с тем же именем в каталоге класса. Когда функция применяется к объекту, то ОНА прежде всего просматривает каталог соответствующего класса, а уже потом другие пути доступа. Чтобы переопределить функцию plot для некоторого класса, надо просто разместить М-файл plot.m в соответствующем каталоге класса: @<имя_класса>\р1оt.m
Пример: (На примере того же класса List) a=plot(obj)
disp('Значения полей объекта следующие:') disp(obj.number)
disp(obj.name)
disp(obj.mark) disp( )
, где obj.***** - поля данного объекта.
(отличием от привычной команды plot() в данном примере является то, что на экран выводятся значения полей объекта класса obj).
Функция methods (Позволяет просмотреть все методы класса) имеет следующие форматы:
methods('имя_класса') или methods имя класса
Пример: выводит на экран все методы для данного класса в следующем виде:
Methods ('List')
Methods for class List: get list nargin plot set
Иерархия объектов
Правило старшинства устанавливает иерархию объектов в системе MATLAB. Это позволяет управлять последовательностью обработки выражений, составленных из объектов. В системе MATLAB принято, что объекты имеют один приоритет и при выполнении выражения вызывается метод, ассоциированный с крайним левым объектом. Если установлено соотношение старшинства, то вызывается метод для класса с самым высоким приоритетом. Для установления иерархии объектов служат функции конструктора: inferiorto и superiorto.
Функция Superiorto('class_A') устанавливает более высокий приоритет объектов других классов по отношению к объектам класса, указанного в качестве аргумента.
Функция inferiorto('class А') устанавливает более низкий приоритет объектов других классов по отношению к объектам класса, указанного в качестве аргумента, (иначе говоря, объекты класса class_A имеют наивысший приоритет).
100
Индексация объектов
Общее правило состоит в том, что индексация объекта аналогична индексации структур.
Индексная ссылка. Использование индекса или указателя поля в правой части оператора присваивания называется индексной ссылкой. В этих случаях вызывается метод subsref, реализованный в виде встроенной функции. Соответствующие выражения могут иметь следующий вид: A(l), A{1}, A. field. Каждый из них приводит к вызову метода subsref в форме:
В = subsref(A, S)
Второй аргумент S является структурой с двумя полями. S.type - строка, содержащая символы'( }','; }' или '.'. которые определяют тип индекса.
•круглые скобки соответствуют числовому массиву;
•фигурные - массиву ячеек;
•точка - структуре.
S.subs - массив ячеек или строка, содержащая фактические индексы, (двоеточие, используемое как индекс, соответствует строковой переменной':')
Таким образом выражение А(1:2,:) вызывает метод subsref(A, S), где S - структура размера 1х1:
S.type = '( )' S.subs=(1:2,':')
Эти простые обращения могут быть объединены в более сложные индексные выражения.
Пример:
Рис. 5.10 Схема, иллюстрирующая индексную структуру многомерного массива PATIENT.
101
В этом случае величина length(S) определяет количество уровней индексации. Таким образом выражение A(l, 2).name(3:4) вызывает метод subsret (A, S), где
S- структура размера 3х1 со следующими значениями полей:
S(l).type='( )' |
S(2).type ='.' |
S(3).type ='( )' |
|
S(l).subs = '{1,2}' |
S(2).subs = 'name' |
S(3).subs = '{3.4} |
|
Индексное присваивание. Использование индекса или указателя поля в левой части оператора присваивания называется индексным присваиванием. В этих случаях MATLAB вызывает метод subsasgn, реализованный в виде встроенной функции.
Пример:
А(1)=В А{1}=В A.field=B
(каждый из них приводит к вызову метода subsasgn в форме А = subsasgn(A, S, В)) Поля структуры S аналогичны полям структуры в случае индексной ссылки.
Функция subsasgn различает присваивание вида A(i) = [] и A(i) = В, где В - пустой массив.
>>a.name='Caшa';
>>a.group='SAU';
>>a.course=4;
>>a
name: Саша grope: SAU course: 4 из-
меним значение поля:
>>a.name = strcat(a.name,num2str(1)); >>a
name: Саша1 grope: SAU course: 4
При необходимости работать с такого рода структурами данных, удобным является создание своего пользовательского класса.
Наследование
Процедура, когда объекты одного класса приобретают свойства объект некоторый объект (дочерний) наследует свойства другого (родителя), дочерний объект включает все поля родительского объекта и может вызывать соответствующие методы.
Наследование - главное свойство объектно-ориентированного программирования. Оно позволяет многократно применять программы, разработанные для родительских объектов, к дочерним. Методы родительского класса имеют доступ только к тем полям, которые унаследованы от родительского класса, а не к полям
102