Правило старшинства
устанавливает иерархию объектов в системе MATLAB.
Это позволяет управлять последовательностью
обработки выражений, составленных из объектов. В
системе MATLAB принято, что объекты имеют один
приоритет и при выполнении выражения вызывается
метод, ассоциированный с крайним левым объектом.
Если установлено соотношение старшинства, то
вызывается метод для класса с самым высоким
приоритетом. Для установления иерархии объектов
служат функции конструктора inferiorto и superiorto. Функция
superiorto('class_A') устанавливает более высокий
приоритет объектов других классов по отношению к
объектам класса, указанного в качестве
аргумента.
Допустим, что мы решили добавить класс объектов
rational, и тогда ожидается появление смешанных
выражений, которые включают полиномы и
рациональные функции. Причем класс rational должен
находиться выше в иерархии классов, чем класс
polynom. Это может быть реализовано указанием в
конструкторе @rational/rational.m оператора superiorto('polynom').
При этом в методы класса polynom никаких изменений
не вносится.
Тогда выражения типа p + r, r + p, p*r и r*p, включающие
полином p и рациональную функцию r будут
использовать методы, определенные в
конструкторе.
Функция inferiorto('class_A') устанавливает более низкий
приоритет объектов других классов по отношению к
объектам класса, указанного в качестве
аргумента; иначе говоря, объекты класса class_A
имеют наивысший приоритет.
Индексация объектов
Общее правило состоит в том, что индексации
объектов аналогична индексации структур.
Индексная ссылка. Использование
индекса или указателя поля в правой части
оператора присваивания называется индексной
ссылкой. В этих случаях вызывается метод subsref,
реализованный в виде встроенной функции.
Соответствующие выражения могут иметь следующий
вид A(I), A{I}, A.field. Каждый из них приводит к вызову
метода subsref в форме
B = subsref(A, S)
Второй аргумент S является структурой с двумя
полями. Поле S.type - строка, содержащая символы '( )',
'{ }' или '.', которые определяют тип индекса.
Круглые скобки соответствуют числовому массиву;
фигурные - массиву ячеек; точка - структуре. Поле
S.subs - массив ячеек или строка, содержащая
фактические индексы. Двоеточие, используемое как
индекс, соответствует строковой переменной ':'.
Например, выражение A(1:2, :) вызывает метод subsref(A,
S), где S - структура размера 1х1 вида
S.type = '( )'
S.subs = {1:2, ':'}
Выражение A{1:2} вызывает метод subsref(A, S), где S -
структура вида
S.type ='{ }'
S.subs = {1:2}.
Выражение A.field вызывает метод subsref(A, S), где S -
структура вида
S.type = '.'
S.subs = 'field'.
Эти простые обращения могут быть объединены в
более сложные индексные выражения. В этом случае
length(S) определяет количество уровней индексации.
Например, выражение A(1, 2).name(3:4) вызывает метод
subsref(A, S), где S - структура размера 3х1 со следующими
значениями полей
S(1).type = '( )' |
S(2).type = '.' |
S(3).type = '( )' |
S(1).subs = '{1, 2}' |
S(2).subs = 'name' |
S(3).subs = '{3:4}' |
Индексное присваивание. Использование
индекса или указателя поля в левой части
оператора присваивания называется индексным
присваиванием. В этих случаях MATLAB вызывает метод
subsasgn, реализованный в виде встроенной функции.
Соответствующие выражения могут иметь
следующий вид
A(I) = B
A{I} = B
A.field = B
Каждый из них приводит к вызову метода subsasgn в
форме
A = subsasgn(A, S,
B)
Поля структуры S аналогичны полям структуры в
случае индексной ссылки.
Функция subsasgn различает присваивание вида A(i) = [ ]
и A(i) = B, где B - пустой массив.
Если правая часть - символ пустого массива [ ], а
не переменная, то третий аргумент входа функции
subsasgn является строкой '[ ]'. Следовательно, при
разработке собственного метода типа subsasgn
следует различать эти два случая.
|