exponenta event banner

Изменяемый дескриптор и члены перечисления неизменяемых значений

Выбор перечислений на основе обработки или значений

Перечисление дескриптора используется для перечисления набора объектов, состояние которых может изменяться с течением времени. Перечисление значений используется для перечисления набора абстрактных (и неизменяемых) значений. Сведения о классах дескрипторов и значений см. в разделе Сравнение классов дескрипторов и значений.

Классы перечисления на основе значений

Класс перечисления на основе значений имеет фиксированный набор определенных значений. Измените эти значения, изменив значения свойств. Это позволяет расширить или изменить фиксированный набор значений для этого класса перечисления.

Унаследованное свойство 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. Однако в отличие от классов дескрипторов, которые не являются классами перечисления, 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

Связанные темы