Определение классов перечисления

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

Создайте класс перечисления путем добавления блока 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               

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

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

Задайте методы в классе перечисления как любой класс MATLAB. Например, вот класс WeekDays с методом под названием добавленный isMeetingDay:

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 =

     0

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

isMeetingDay(WeekDays.Wednesday)
ans =

     1

Define Properties в классах перечисления

Добавьте свойства в класс перечисления, когда необходимо будет хранить данные, связанные с участниками перечисления. Установите значения свойств в конструкторе класса. Например, класс 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.

Для получения дополнительной информации о классах перечисления, которые задают свойства, смотрите Изменяемый Указатель по сравнению с Неизменяемыми участниками Перечисления Значения.

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

Каждый оператор в блоке перечисления является именем участника перечисления, опционально сопровождаемого списком аргументов. Если класс перечисления задает конструктора, 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

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

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

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

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

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

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

Похожие темы