Материалы, представленные в этом разделе, основаны на понимании информации, представленной в следующих разделах.
MATLAB ® следует следующим правилам для конкатенации объектов:
MATLAB всегда пытается преобразовать все объекты в доминирующий класс.
Определяемые пользователем классы имеют приоритет над встроенными классами, такими как double.
Если между любыми двумя объектами нет определенного отношения доминирования, то доминирует самый левый объект (см. Приоритет класса).
При преобразовании в доминирующий класс во время конкатенации или подстрочного назначения MATLAB выполняет поиск недоминирующего класса для метода преобразования, который совпадает с именем доминирующего класса. Если такой метод преобразования существует, MATLAB вызывает его. Если метод преобразования не существует, MATLAB вызывает конструктор доминирующего класса для недоминантного объекта.
Доминирующий класс может быть определен horzcat, vertcat, или cat методы, изменяющие процесс конкатенации по умолчанию.
Примечание
MATLAB не преобразует объекты в общий суперкласс, если только эти объекты не являются частью гетерогенной иерархии. Дополнительные сведения см. в разделе Проектирование иерархий гетерогенных классов.
Объединение объектов в массивы:
ary = [obj1,obj2,obj3,...,objn];
Размер ary 1 на n.
ary = [obj1;obj2;obj3;...;objn];
Размер ary n-by-1.
Класс массивов совпадает с классом объектов, подлежащих конкатенации. Конкатенация объектов различных классов возможна, если MATLAB может преобразовать объекты в доминирующий класс. MATLAB пытается преобразовать непохожие объекты с помощью:
Вызов метода конвертера нижестоящих объектов, если таковой существует.
Передача нижестоящего объекта конструктору доминирующего класса для создания объекта доминирующего класса.
Если преобразование нижестоящего объекта выполнено успешно, MATLAB возвращает массив доминирующего класса. Если преобразование невозможно, MATLAB возвращает ошибку.
MATLAB вызывает конструктор доминирующего класса для преобразования объекта низшего класса в доминирующий класс. MATLAB передает нижестоящий объект конструктору в качестве аргумента. Если конструкция класса позволяет конструктору доминирующего класса принимать объекты низших классов в качестве входных аргументов, то конкатенация возможна без реализации отдельного метода конвертера.
Если конструктор просто присваивает этот аргумент свойству, результатом является объект доминирующего класса с объектом нижестоящего класса, хранящимся в свойстве. Если это назначение не является желательным результатом, убедитесь, что конструкторы классов включают адекватную проверку ошибок.
Например, рассмотрим класс ColorClass и два подкласса, RGBColor и HSVColor:
classdef ColorClass properties Color end end
Класс RGBColor наследует Color свойство из ColorClass. RGBColor сохраняет значение цвета, определенное как трехэлементный вектор из красного, зеленого и синего (RGB) значений. Конструктор не ограничивает значение входного аргумента. Он присваивает это значение непосредственно Color собственность.
classdef RGBColor < ColorClass methods function obj = RGBColor(rgb) if nargin > 0 obj.Color = rgb; end end end end
Класс HSVColor также наследует Color свойство из ColorClass. HSVColor сохраняет значение цвета, определенное как трехэлементный вектор значений оттенка, насыщенности, яркости (HSV).
classdef HSVColor < ColorClass methods function obj = HSVColor(hsv) if nargin > 0 obj.Color = hsv; end end end end
Создайте экземпляр каждого класса и объедините его в массив. RGBColor объект является доминирующим, поскольку он является самым левым объектом, и ни один из классов не определяет отношения доминирования:
crgb = RGBColor([1 0 0]); chsv = HSVColor([0 1 1]); ary = [crgb,chsv]; class(ary)
ans = RGBColor
Эти объекты можно объединить в массив, поскольку MATLAB может передавать нижестоящий объект класса HSVColor конструктору доминирующего класса. Однако обратите внимание, что Color свойство второго RGBColor объект в массиве фактически содержит HSVColor объект, а не RGB спецификация цвета:
ary(2).Color
ans =
HSVColor with properties:
Color: [0 1 1]Избегайте этого нежелательного поведения путем:
Внедрение методов конвертера
Выполнение проверки аргументов в конструкторах классов перед назначением значений свойствам
Если конструкция класса требует преобразования объектов, реализуйте методы конвертера для этой цели.
ColorClass класс определяет методы конвертера для RGBColor и HSVColor объекты:
classdef ColorClass properties Color end methods function rgbObj = RGBColor(obj) if isa(obj,'HSVColor') rgbObj = RGBColor(hsv2rgb(obj.Color)); end end function hsvObj = HSVColor(obj) if isa(obj,'RGBColor') hsvObj = HSVColor(rgb2hsv(obj.Color)); end end end end
Создание массива RGBColor и HSVColor объекты с измененным суперклассом:
crgb = RGBColor([1 0 0]); chsv = HSVColor([0 1 1]); ary = [crgb,chsv]; class(ary)
ans = RGBColor
MATLAB вызывает метод преобразователя для HSVColor , который наследуется от суперкласса. Второй элемент массива теперь является RGBColor объект со спецификацией цвета RGB, назначенной Color свойство:
ary(2)
ans =
RGBColor with properties:
Color: [1 0 0]
ary(2).Color
ans =
1 0 0Если самый левый объект относится к классу HSVColor, массив ary также относится к классу HSVColor, и MATLAB преобразует Color для спецификации цвета HSV.
ary = [chsv crgb]
ary =
1x2 HSVColor
Properties:
Color
ary(2).Color
ans =
0 1 1Определение метода конвертера в суперклассе и добавление лучшей проверки аргументов в конструкторах подкласса дает более предсказуемые результаты. Вот RGBColor конструктор класса с проверкой аргументов:
classdef RGBColor < ColorClass methods function obj = RGBColor(rgb) if nargin == 0 rgb = [0 0 0]; else if ~(isa(rgb,'double')... && size(rgb,2) == 3 ... && max(rgb) <= 1 && min(rgb) >= 0) error('Specify color as RGB values') end end obj.Color = rgb; end end end
Приложения могут требовать дополнительной проверки ошибок и других методов кодирования. Классы в этих примерах предназначены только для демонстрации концепций.