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

Элементарные знания

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

Правила конкатенации 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

Создайте экземпляр каждого класса и конкатенируйте их в массив. 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

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

Похожие темы