Используйте перечисление указателя, чтобы перечислить набор объектов, состояние которых может изменяться в зависимости от времени. Используйте перечисление значения, чтобы перечислить набор краткого обзора (и неизменяемый) значения. Для получения информации об указателе и классах значения, смотрите Сравнение Классов Указателя и Значения.
Основанный на значении класс перечисления имеет фиксированный набор определенных значений. Измените эти значения путем изменения значений свойств. Выполнение так расширяет или изменяет фиксированное множество значений для этого класса перечисления.
SetAccess Должно быть неизменяемымОснованные на значении классы перечисления неявно задают SetAccess атрибуты всех свойств как immutable. Вы не можете установить SetAccess припишите любому другому значению.
Однако все свойства суперкласса должны явным образом свойство define 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
Конструктор присваивает входные параметры RG, и 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. Однако различающиеся классы Handle, которые не являются классами перечисления, 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