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

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

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

Похожие темы