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