Используйте перечисление указателей, чтобы перечислить набор объектов, состояние которых может изменяться с течением времени. Используйте перечисление значений, чтобы перечислить набор абстрактных (и неизменяемых) значений. Для получения информации о классах указателей и значений смотрите Сравнение классов указателей и значений.
Основанный на значениях класс перечисления имеет фиксированный набор конкретных значений. Измените эти значения путем изменения значений свойств. Это расширяет или изменяет фиксированное множество значений для этого класса перечисления.
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 = 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
и ==
отличаются при использовании с указателями.
The MachineState
класс задают два представителей перечисления, которые будут представлять состояние компьютера, работающего или не работающего.
classdef MachineState enumeration Running NotRunning end end
The Machine
класс представляет машину с начальными и стоповыми операциями. The 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