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

Выбор 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

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

См. метод eq handle для получения информации о том, как 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 и вызовите методы stop и start

m = Machine;
m.start
Running
m.stop
NotRunning

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте