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