Перечисление дескриптора используется для перечисления набора объектов, состояние которых может изменяться с течением времени. Перечисление значений используется для перечисления набора абстрактных (и неизменяемых) значений. Сведения о классах дескрипторов и значений см. в разделе Сравнение классов дескрипторов и значений.
Класс перечисления на основе значений имеет фиксированный набор определенных значений. Измените эти значения, изменив значения свойств. Это позволяет расширить или изменить фиксированный набор значений для этого класса перечисления.
SetAccess Должен быть неизменнымКлассы перечисления на основе значений неявно определяют SetAccess атрибуты всех свойств как immutable. Вы не можете установить SetAccess атрибут для любого другого значения.
Однако все свойства суперкласса должны явно определять свойство SetAccess как immutable.
Экземпляр класса перечисления на основе значений уникален до тех пор, пока класс не будет очищен и перезагружен. Например, данный класс:
classdef WeekDays enumeration Monday, Tuesday, Wednesday, Thursday, Friday end end
MATLAB ® рассматриваетa и b в качестве эквивалента:
a = WeekDays.Monday; b = WeekDays.Monday; isequal(a,b)
ans =
1a == b
ans =
1
Классы перечисления на основе значений, определяющие свойства, являются неизменяемыми. Например, Colors класс перечисления связывает значения RGB с именами цветов.
classdef Colors properties R = 0 G = 0 B = 0 end methods function c = Colors(r,g,b) c.R = r; c.G = g; c.B = b; end end enumeration Red (1, 0, 0) Green (0, 1, 0) Blue (0, 0, 1) end end
Конструктор присваивает входные аргументы R, G, и B свойства:
red = Colors.Red; [red.R,red.G,red.B]
ans =
1 0 0Нельзя изменить значение свойства:
red.G = 1;
You cannot set the read-only property 'G' of Colors.Классы перечисления на основе дескрипторов, определяющие свойства, могут изменяться. Вывести классы перечисления из handle когда необходимо иметь возможность изменять значения свойств в экземплярах этого класса.
Примечание
Невозможно получить класс перечисления из matlab.mixin.Copyable поскольку количество создаваемых экземпляров ограничено экземплярами, определенными внутри блока перечисления.
Если задан класс перечисления на основе дескриптора со свойствами, изменение значения свойства экземпляра приводит к тому, что все ссылки на этот экземпляр отражают измененное значение.
Например, HandleColors класс перечисления связывает значения RGB с именами цветов, такими же, как Colors в предыдущем примере. Однако HandleColors извлекает из handle:
classdef HandleColors < handle properties R = 0 G = 0 B = 0 end methods function c = HandleColors(r, g, b) c.R = r; c.G = g; c.B = b; end end enumeration Red (1, 0, 0) Green (0, 1, 0) Blue (0, 0, 1) end end
Создание экземпляра HandleColors.Red и возвращает значение R свойство:
a = HandleColors.Red; a.R
ans =
1
MATLAB создает HandleColors.Red элемент перечисления, который устанавливает R свойство для 1, G свойство для 0, и B свойство для 0.
Изменение значения R свойство для 0.8:
a.R = 0.8;
После установки значения R свойство для 0.8, создайте другой экземпляр, bиз HandleColors.Red:
b = HandleColors.Red; b.R
ans =
0.8000Значение R свойство вновь созданного экземпляра также 0.8. Сеанс MATLAB имеет только одно значение для любого члена перечисления в любой данный момент времени.
Очистка переменных рабочей области не изменяет текущее определение элемента перечисления HandleColors.Red:
clear a = HandleColors.Red; a.R
ans =
0.8000Очистить класс для перезагрузки определения HandleColors класс:
clear classes
a = HandleColors.Red;
a.R
ans =
1Чтобы предотвратить переназначение данного значения свойства, задайте это свойство SetAccess атрибут для immutable.
Назначьте две переменные определенному члену перечисления:
a = HandleColors.Red; b = HandleColors.Red;
Выдержать сравнение a и b использование isequal:
isequal(a,b)
ans =
1Значения свойств a и b одинаковы, так что isequal прибыль true. Однако в отличие от классов дескрипторов, которые не являются классами перечисления, a и b являются одним и тем же дескриптором, поскольку существует только один элемент перечисления. Определение равенства обработки с помощью == (рукоятка eq метод).
a == b
ans =
1См. раздел handle
eq метод для информации о том, как isequal и == отличаются при использовании с ручками.
MachineState класс определяет два элемента перечисления для представления состояния компьютера, запущенного или не запущенного.
classdef MachineState enumeration Running NotRunning end end
Machine представляет машину с операциями запуска и остановки. MachineState перечисления просты в работе из-за их eq и char методы, и они приводят к код, который легко прочитать.
classdef Machine < handle properties (SetAccess = private) State = MachineState.NotRunning end methods function start(machine) if machine.State == MachineState.NotRunning machine.State = MachineState.Running; end disp (machine.State.char) end function stop(machine) if machine.State == MachineState.Running machine.State = MachineState.NotRunning; end disp (machine.State.char) end end end
Создать Machine объект и вызов start и stop методы
m = Machine; m.start
Running
m.stop
NotRunning