Конкатенация объектов разных классов

Базовые знания

Материалы, представленные в этом разделе, основаны на понимании информации, представленной в следующих разделах.

Правила конкатенации MATLAB

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

Ваши приложения могут потребовать дополнительной проверки ошибок и других методов кодирования. Классы в этих примерах предназначены только для демонстрации концепций.

Похожие темы