Используйте перечисление указателя, чтобы перечислить набор объектов, состояние которых может изменяться в зависимости от времени. Используйте перечисление значения, чтобы перечислить набор краткого обзора (и неизменяемый) значения. Для получения информации об указателе и классах значения, смотрите Сравнение Классов Указателя и Значения.
Основанный на значении класс перечисления имеет фиксированный набор определенных значений. Измените эти значения путем изменения значений свойств. Выполнение так расширяет или изменяет фиксированное множество значений для этого класса перечисления.
Унаследованное свойство 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 = 1
a == 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
. Однако различающиеся классы Handle, которые не являются классами перечисления, a
и b
, являются тем же указателем, потому что существует только один участник перечисления. Определите равенство указателя с помощью ==
(указатель метод eq
).
a == b
ans = 1
См. метод eq
handle
для получения информации о том, как 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
и вызовите методы stop
и start
m = Machine; m.start
Running
m.stop
NotRunning