可变句柄vs.不可变值枚举成员
选择句柄或基于值的枚举
使用句柄枚举枚举一组对象,这些对象的状态可以随时间变化。使用值枚举枚举一组抽象(且不可变)值。有关句柄和值类的信息,请参见句柄类和值类的比较.
基于值的枚举类
基于值的枚举类具有一组固定的特定值。通过更改属性值来修改这些值。这样做将扩展或更改此枚举类的固定值集。
继承的财产SetAccess
必须是不可变的
类的基于值的枚举类隐式定义SetAccess
属性的所有属性为不可变的
.您不能设置SetAccess
属性为任何其他值。
但是,所有超类属性都必须显式地定义属性SetAccess
作为不可变的
.
枚举成员保持不变
基于值的枚举类的实例在清除和重新加载该类之前都是惟一的。例如,给定这个类:
classdef工作日枚举星期一,星期二,星期三,星期四,星期五结束结束
MATLAB®认为一个
而且b
是等价的:
a = WeekDays.Monday;b = WeekDays.Monday;isequal (a, b)
Ans = 1
A == b
Ans = 1
枚举成员属性保持不变
定义属性的基于值的枚举类是不可变的。例如,颜色
枚举类关联RGB值和颜色名称。
classdef颜色属性R = 0 g = 0 b = 0结束方法函数c =颜色(r,g,b) c = r;c.G = g;c.B = b;结束结束枚举红色(1,0,0)绿色(0,1,0)蓝色(0,0,1)结束结束
构造函数将输入参数赋值给R
,G
,B
属性:
红色=颜色。[red.R, red.G red.B]
Ans = 1 0 0
不能更改属性值:
红色的。G= 1;
不能设置颜色的只读属性“G”。
基于句柄的枚举类
定义属性的基于句柄的枚举类是可变的。类派生枚举类处理
当必须能够更改该类实例上的属性值时,可以使用。
请注意
不能从中派生枚举类matlab.mixin.Copyable
因为可以创建的实例数量仅限于枚举块中定义的实例。
枚举成员保持不变
给定一个具有属性的基于句柄的枚举类,更改实例的属性值会导致对该实例的所有引用都反映已更改的值。
例如,HandleColors
类将RGB值与颜色名称相关联,与颜色
类。然而,HandleColors
来源于处理
:
classdefHandleColors < handle属性R = 0 g = 0 b = 0结束方法函数c = HandleColors(r, g, b) c = r;c.G = g;c.B = b;结束结束枚举红色(1,0,0)绿色(0,1,0)蓝色(0,0,1)结束结束
创建的实例HandleColors。红色的
的值R
属性:
a = HandleColors.Red;a.R
Ans = 1
MATLAB构造HandleColors。红色的
成员,该成员设置R
财产1
,G
财产0
,以及B
财产0
.
的值R
财产0.8
:
a.R = 0.8;
的值设置后R
财产0.8
,创建另一个实例,b
的,HandleColors。红色的
:
b = HandleColors.Red;b.R
Ans = 0.8000
的值R
属性的值为0.8
.MATLAB会话在任何给定时间对任何枚举成员只有一个值。
清除工作区变量不会更改枚举成员的当前定义HandleColors。红色的
:
clear a = HandleColors.Red;a.R
Ans = 0.8000
类的定义HandleColors
类:
清晰的类a = HandleColors.Red;a.R
Ans = 1
要防止重新分配给定的属性值,请设置该属性的SetAccess
属性来不可变的
.
基于句柄枚举的相等性
将两个变量赋给一个特定的枚举成员:
a = HandleColors.Red;b = HandleColors.Red;
比较一个
而且b
使用isequal
:
isequal (a, b)
Ans = 1
的属性值一个
而且b
都一样,所以呢isequal
返回真正的
.然而,与不是枚举类的句柄类不同,一个
而且b
是相同的句柄,因为只有一个枚举成员。使用以下方法确定句柄相等性= =
(处理情商
方法)。
A == b
Ans = 1
看到处理
情商
方法获取有关如何的信息isequal
而且= =
与手柄一起使用时不同。
用枚举表示状态
的MachineState
类定义了两个枚举成员来表示机器的状态,运行或不运行。
classdefMachineState枚举运行NotRunning结束结束
的机
类表示具有启动和停止操作的机器。的MachineState
枚举很容易使用,因为它们情商
而且字符
方法,从而生成易于阅读的代码。
classdef机器<手柄属性(SetAccess = private) State = MachineState。NotRunning结束方法函数开始(机器)如果机器。State == MachineState。NotRunning机器。State = MachineState.Running;结束disp (machine.State.char)结束函数停止(机器)如果机器。State == MachineState。跑步机。State = MachineState.NotRunning;结束disp (machine.State.char)结束结束结束
创建一个机
对象和调用开始
而且停止
方法
m =机器;m.start
运行
m.stop
NotRunning