Материалы, представленные в этом разделе, основаны на понимании информации, представленной в следующих разделах.
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-на-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
Создайте образец каждого класса и объедините их в массив. The 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]Избегайте этого нежелательного поведения путем:
Реализация методов конвертера
Выполнение проверки аргументов в конструкторах классов перед присвоением значений свойствам
Если ваш проект класса требует преобразования объекта, реализуйте методы конвертера для этой цели.
The 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
Ваши приложения могут потребовать дополнительной проверки ошибок и других методов кодирования. Классы в этих примерах предназначены только для демонстрации концепций.