定义枚举类
枚举类
通过向类定义中添加 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 enumeration
Tuesdaytoday 是 WeekDays 类的变量:
class(today)
ans =
'WeekDays'
转换为超类值
如果枚举类指定超类,您可以通过将枚举对象传递给超类构造函数,将枚举对象转换为超类。然而,超类构造函数必须能够接受自己的类作为输入,并返回超类的实例。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 值。uint32 构造函数接受 Bearing 子类的对象,并返回 uint32 类的对象。
b = uint32(a)
b = uint32 90
从数值超类派生的枚举不能有稀疏基础值。 (自 R2026a 起)
在枚举类中定义方法
在枚举类中定义方法的方式与在任何 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