- •Объектно-ориентированная модель проектирования
- •Объекты и классы
- •Вызов методов
- •Переопределение классов
- •Иерархия объектов. Индексация объектов
- •Индексация объектов.
- •Наследование
- •Создание классов с помощью classdef
- •Описание атрибутов свойств
- •Описание атрибутов методов
- •Описание атрибутов событий
Иерархия объектов. Индексация объектов
Правило старшинства устанавливает иерархию объектов в системе 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 следует различать эти два случая.
