Задайте классы перечисления

Класс перечисления

Создайте класс перечисления путем добавления enumeration блок в определение класса. Для примера, WeekDays класс перечисляет набор дней недели.

classdef WeekDays
   enumeration
      Monday, Tuesday, Wednesday, Thursday, Friday
   end
end

Выполнение MATLAB® код в следующих разделах, поместите WeekDays определение класса в .m файл в вашем пути.

Создайте представитель перечисления

Обратитесь к представителю перечисления с использованием имени класса и имени представителя:

ClassName.MemberName

Например, присвойте представителя перечисления WeekDays.Tuesday в переменную today:

today = WeekDays.Tuesday;

today является переменной класса WeekDays:

whos
  Name       Size            Bytes  Class       Attributes

  today      1x1               104  WeekDays              
today
today = 

    Tuesday

Преобразуйте в значение суперкласса

Если класс перечисления задает суперкласс, можно преобразовать объект перечисления в суперкласс, передав объект в конструктор суперкласса. Однако конструктор суперкласса должен иметь возможность принять свой собственный класс в качестве входных данных и вернуть образец суперкласса. MATLAB встроенные числовые классы, такие как uint32, разрешить это преобразование.

Для примера, Bearing класс выводится из uint32 встроенный класс:

classdef Bearing < uint32
   enumeration
      North (0)
      East  (90)
      South (180)
      West  (270)
   end
end

Назначьте Bearing.East представитель переменной a:

a = Bearing.East;

Передайте a в конструктор суперкласса и вернуть uint32 значение:

b = uint32(a);
whos
  Name      Size            Bytes  Class      Attributes

  a         1x1                60  Bearing              
  b         1x1                 4  uint32               

The uint32 конструктор принимает объект подкласса Bearing и возвращает объект класса uint32.

Задайте методы в классах перечисления

Задайте методы в классе перечисления, как любой класс MATLAB. Для примера задайте метод, называемый isMeetingDay для WeekDays класс перечисления. Пример использования состоит в том, что пользователь имеет повторяющееся собрание по вторникам. Метод проверяет, является ли входной параметр образцом WeekDays представитель Tuesday.

classdef WeekDays
   enumeration
      Monday, Tuesday, Wednesday, Thursday, Friday
   end
   methods
      function tf = isMeetingDay(obj)
         tf = WeekDays.Tuesday == obj;
      end
   end
end

Функции isMeetingDay с образцом WeekDays класс:

today = WeekDays.Tuesday;
today.isMeetingDay
ans =

     1

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

isMeetingDay(WeekDays.Wednesday)
ans =

     0

Задайте свойства в классах перечисления

Добавляйте свойства к классу перечисления, когда необходимо хранить данные, относящиеся к представителям перечисления. Установите значения свойств в конструкторе классов. Для примера, SyntaxColors класс задает три свойства. Конструктор классов присваивает значения входных параметров соответствующим свойствам при ссылке на член класса.

classdef SyntaxColors
   properties
      R
      G
      B
   end
   methods
      function c = SyntaxColors(r, g, b)
         c.R = r; c.G = g; c.B = b;
      end
   end
   enumeration
      Error   (1, 0, 0)
      Comment (0, 1, 0)
      Keyword (0, 0, 1)
      String  (1, 0, 1)
   end
end

Когда вы ссылаетесь на представителя перечисления, конструктор инициализирует значения свойств:

e = SyntaxColors.Error;
e.R
ans =

     1

Потому что SyntaxColors является классом значений (он не выводится из handle), только конструктор классов может задать значения свойств:

e.R = 0
You cannot set the read-only property 'R' of SyntaxColors.

Для получения дополнительной информации о классах перечисления, которые задают свойства, см. Mutable Handle vs. Immutable Value Enumeration Members.

Последовательность вызовов конструктора классов перечисления

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

MATLAB предоставляет конструктор по умолчанию для всех классов перечисления, которые явным образом не определяют конструктор. Конструктор по умолчанию создает образец класса перечисления:

  • Не используя входных параметров, если представитель перечисления не задает входных параметров

  • Использование входных параметров, определенных в классе перечисления для этого представителя

Для примера входных параметров для Bool классы 0 для Bool.No и 1 для Bool.Yes.

classdef Bool < logical
   enumeration
      No  (0)
      Yes (1)
   end
end

Значения 0 и 1 относятся к logical классов потому что конструктор по умолчанию передает аргумент в первый суперкласс. То есть, этот оператор:

n = Bool.No;

Приводит к вызову logical что эквивалентно следующему оператору в конструкторе:

function obj = Bool(val)
   obj@logical(val)
end

MATLAB передает аргумент представителя только первому суперклассу. Например, предположим Bool производный от другого класса:

classdef Bool < logical & MyBool
   enumeration
      No  (0)
      Yes (1)
   end
end

The MyBool класс может добавить некоторые специализированные поведения:

classdef MyBool
   methods
      function boolValues = testBools(obj)
         ...
      end
   end
end

Значение по умолчанию Bool конструктор ведет себя так, как будто задана эта функция:

  • Аргумент передан первому конструктору суперкласса

  • Последующие конструкторы не передали никаких аргументов

function obj = Bool(val)
   obj@logical(val) 
   obj@MyBool       
end

Похожие темы