定义枚举类
枚举类
通过向类定义中添加 enumeration
代码块可创建枚举类。例如,WeekDays
类列举一周中的工作日。
classdef WeekDays enumeration Monday, Tuesday, Wednesday, Thursday, Friday end end
为了执行以下各节中的 MATLAB® 代码,请将 WeekDays
类定义放在您的路径上的 .m
文件中。
构造枚举成员
使用类名和成员名引用枚举成员:
ClassName.MemberName
例如,将枚举成员 WeekDays.Tuesday
赋给变量 today
:
today = WeekDays.Tuesday;
today
是 WeekDays
类的变量:
whos
Name Size Bytes Class Attributes today 1x1 104 WeekDays
today
today = Tuesday
转换为超类值
如果枚举类指定超类,您可以通过将枚举对象传递给超类构造函数,将枚举对象转换为超类。然而,超类构造函数必须能够接受自己的类作为输入,并返回超类的实例。MATLAB 的内置数值类(如 uint32
)允许此转换。
例如,Bearing
类派生自 uint32
内置类:
classdef Bearing < uint32 enumeration North (0) East (90) South (180) West (270) end end
将 Bearing.East
成员赋给变量 a
:
a = Bearing.East;
将 a
传递给超类构造函数,并返回 uint32
值:
b = uint32(a); whos
Name Size Bytes Class Attributes a 1x1 4 Bearing b 1x1 4 uint32
uint32
构造函数接受 Bearing
子类的对象,并返回 uint32
类的对象。
在枚举类中定义方法
在枚举类中定义方法的方式与在任何 MATLAB 类中的定义方式一样。例如,为 WeekDays
枚举类定义一个名为 isMeetingDay
的方法。用例是用户在星期二定期开会。该方法检查输入参数是否为 WeekDays
成员 Tuesday
的实例。
classdef WeekDays enumeration Monday, Tuesday, Wednesday, Thursday, Friday end methods function tf = isMeetingDay(obj) tf = WeekDays.Tuesday == obj; end end end
使用 WeekDays
类的实例调用 isMeetingDay
:
today = WeekDays.Tuesday; today.isMeetingDay
ans = 1
您也可以使用枚举成员作为方法的直接输入:
isMeetingDay(WeekDays.Wednesday)
ans = 0
在枚举类中定义属性
当必须存储与枚举成员相关的数据时,可向枚举类添加属性。在类构造函数中设置属性值。例如,SyntaxColors
类定义三个属性。当引用类成员时,类构造函数将输入参数的值赋给对应的属性。
classdef SyntaxColors properties R G B end methods function c = SyntaxColors(r, g, b) c.R = r; c.G = g; c.B = b; end end enumeration Error (1, 0, 0) Comment (0, 1, 0) Keyword (0, 0, 1) String (1, 0, 1) end end
当引用枚举成员时,构造函数会初始化属性值:
e = SyntaxColors.Error; e.R
ans = 1
由于 SyntaxColors
是值类(它不从 handle
派生),只有类构造函数可以设置属性值:
e.R = 0
You cannot set the read-only property 'R' of SyntaxColors.
有关定义属性的枚举类的详细信息,请参阅Mutable Handle vs. Immutable Value Enumeration Members。
枚举类构造函数调用顺序
枚举代码块中的每个语句均为枚举成员的名称,其后可跟参数列表。如果枚举类定义了构造函数,MATLAB 会调用该构造函数来创建枚举实例。
MATLAB 为没有显式定义构造函数的所有枚举类提供默认构造函数。默认构造函数创建枚举类的实例时:
如果枚举成员没有定义输入参数,则不使用输入参数
使用枚举类中为该成员定义的输入参数
例如,Bool
类的输入参数是 0
(表示 Bool.No
)和 1
(表示 Bool.Yes
)。
classdef Bool < logical enumeration No (0) Yes (1) end end
值 0
和 1
属于 logical
类,因为默认构造函数将参数传递给第一个超类。也就是说,以下语句:
n = Bool.No;
导致对 logical
的调用,等效于构造函数中的以下语句:
function obj = Bool(val) obj@logical(val) end
MATLAB 只将成员参数传递给第一个超类。例如,假设 Bool
派生自另一个类:
classdef Bool < logical & MyBool enumeration No (0) Yes (1) end end
MyBool
类可以添加一些特化行为:
classdef MyBool methods function boolValues = testBools(obj) ... end end end
默认的 Bool
构造函数的行为类似以下函数:
参数传递给第一个超类构造函数
没有参数传递给后续构造函数
function obj = Bool(val) obj@logical(val) obj@MyBool end