exponenta event banner

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

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

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

Дополнительные сведения о классах перечисления, определяющих свойства, см. в разделах Изменяемый дескриптор и неизменяемые члены перечисления значений.

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

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

Связанные темы