Материал, представленный в этом разделе, основывается на понимании информации, представленной в следующих разделах.
MATLAB® следует этим правилам для конкатенации объектов:
MATLAB всегда пытается преобразовать все объекты в доминирующий класс.
Пользовательские классы более приоритетны по сравнению со встроенными классами как double
.
Если нет никакого заданного отношения преобладания ни между какими двумя объектами, то крайний левый объект доминирует (см. Приоритет Класса).
При преобразовании в доминирующий класс во время конкатенации или преобразованного в нижний индекс присвоения, MATLAB ищет недоминирующий класс метод преобразования, который является тем же именем как доминирующий класс. Если такой метод преобразования существует, MATLAB вызывает его. Если метод преобразования не существует, MATLAB вызывает доминирующего конструктора класса на недоминирующем объекте.
Для доминирующего класса возможно задать horzcat
, vertcat
, или cat
методы, которые изменяют процесс конкатенации по умолчанию.
Примечание
MATLAB не преобразует объекты в общий суперкласс, если те объекты не являются частью неоднородной иерархии. Для получения дополнительной информации смотрите Проектирующие Неоднородные Иерархии классов.
Конкатенация комбинирует объекты в массивы. Например:
ary = [obj1,obj2,obj3];
Размер ary
1 3.
Класс массивов совпадает с классом конкатенируемых объектов. Конкатенация объектов различных классов возможна, если 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
Ваши приложения могут потребовать дополнительной проверки ошибок и других методов кодирования. Классы в этих примерах спроектированы только, чтобы продемонстрировать концепции.