Перечисления, которые инкапсулируют данные

Классы перечисления со свойствами

Классы перечисления могут задать свойства сохранить значения данных. Участники перечисления представляют определенные значения для этих свойств, которые MATLAB® присваивает в конструкторе класса. Для получения информации об определении классов перечисления смотрите, Задают Классы Перечисления.

Храните данные в свойствах

Примечание

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

Задайте свойства в классе перечисления, если вы хотите сопоставить определенные данные с участниками перечисления, но не должны наследовать арифметику, упорядоченное расположение или другие операции, которые MATLAB задает для определенных встроенных классов.

Представление цветов

Задайте класс перечисления, чтобы представлять значения RGB цветов в наборе цветов. Класс Colors задает имена для цветов, каждый из которых использует значения RGB в качестве аргументов к конструктору класса:

classdef Colors
   properties
      R = 0
      G = 0
      B = 0
   end
   methods
      function c = Colors(r, g, b)
         c.R = r; c.G = g; c.B = b;
      end
   end
   enumeration
      Blueish   (18/255,104/255,179/255)
      Reddish   (237/255,36/255,38/255)
      Greenish  (155/255,190/255,61/255)
      Purplish  (123/255,45/255,116/255)
      Yellowish (1,199/255,0)
      LightBlue (77/255,190/255,238/255)
   end
end

Можно получить доступ к значениям свойств через участника перечисления:

Colors.Reddish.R
ans =

    0.9294

Предположим, что вы хотите создать график с новым оттенком красного именованного Reddish:

a = Colors.Reddish;
[a.R,a.G,a.B]
ans =

    0.9294    0.1412    0.1490

Используйте эти значения путем доступа к свойствам элемента перечисления. Например, функция myPlot принимает участника перечисления Colors как входной параметр. Функциональные доступы значения RGB, задающие цвет от значений свойств.

function h = myPlot(x,y,LineColor)
   h = line('XData',x,'YData',y);
   r = LineColor.R;
   g = LineColor.G;
   b = LineColor.B;
   h.Color = [r g b];
end

Создайте график с помощью красноватой цветной линии:

h = myPlot(1:10,1:10,Colors.Reddish);

Класс Colors инкапсулирует определения стандартного набора цветов. Можно изменить определение класса перечисления цветов и не влиять на функции, которые используют перечисления.

Перечисления, задающие категории

Класс Cars задает категории, используемые, чтобы инвентаризировать автомобили. Класс Cars выводит от класса CarPainter, который выводит от handle. Абстрактный класс CarPainter задает метод paint, который изменяет свойство Color, когда автомобиль окрашен в другой цвет.

Класс Cars использует участников перечисления Colors, чтобы задать конечное множество доступных цветов. Точное определение любого данного цвета может измениться независимо от класса Cars.

classdef Cars < CarPainter
   enumeration
      Hybrid (2,'Manual',55,Colors.Reddish)
      Compact(4,'Manual',32,Colors.Greenish)
      MiniVan(6,'Automatic',24,Colors.Blueish)
      SUV    (8,'Automatic',12,Colors.Yellowish)
   end
   properties  (SetAccess = private)
      Cylinders
      Transmission
      MPG
      Color
   end
   methods
      function obj = Cars(cyl,trans,mpg,colr)
         obj.Cylinders = cyl;
         obj.Transmission = trans;
         obj.MPG = mpg;
         obj.Color = colr;
      end
      function paint(obj,colorobj)
         if isa(colorobj,'Colors')
            obj.Color = colorobj;
         else
            [~,cls] = enumeration('Colors');
            disp('Not an available color')
            disp(cls)
         end
      end
   end
end

Класс CarPainter требует, чтобы его подклассы задали метод под названием paint:

classdef CarPainter < handle
   methods (Abstract)
      paint(carobj,colorobj)
   end
end

Задайте экземпляр класса Cars:

c1 = Cars.Compact;

Цветом этого автомобиля является Greenish, как задано перечислением Colors.Greenish:

c1.Color
ans = 

    Greenish 

Используйте метод paint, чтобы изменить автомобильный цвет:

c1.paint(Colors.Reddish)
c1.Color
ans = 

    Reddish

Похожие темы