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