文档

可变句柄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)结束结束

构造函数将输入参数赋值给RG,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

相关的话题

这个话题有用吗?