Изменяемый указатель по сравнению с неизменяемыми участниками перечисления значения

Выбор Handle - или основанные на значении перечисления

Используйте перечисление указателя, чтобы перечислить набор объектов, состояние которых может изменяться в зависимости от времени. Используйте перечисление значения, чтобы перечислить набор краткого обзора (и неизменяемый) значения. Для получения информации об указателе и классах значения, смотрите Сравнение Классов Указателя и Значения.

Основанные на значении классы перечисления

Основанный на значении класс перечисления имеет фиксированный набор определенных значений. Измените эти значения путем изменения значений свойств. Выполнение так расширяет или изменяет фиксированное множество значений для этого класса перечисления.

Унаследованное свойство 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

Конструктор присваивает входные параметры RG, и 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

Похожие темы