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