Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
08.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
392.7 Кб
Скачать

Иерархия объектов. Индексация объектов

Правило старшинства устанавливает иерархию объектов в системе 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 будут использовать методы, определенные для класса rational.

Функция 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 следует различать эти два случая.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]