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

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

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

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

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

Наследуемые 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

Похожие темы