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