目录
定义枚举类
枚举类
通过向类定义中添加 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 60 Bearing
b 1x1 4 uint32
uint32 构造函数接受 Bearing 子类的对象,并返回 uint32 类的对象。
在枚举类中定义方法
在枚举类中定义方法的方式与在任何 MATLAB 类中的定义方式一样。例如,下面是 WeekDays 类,其中添加了名为 isMeetingDay 的方法:
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 =
0
直接使用枚举成员作为方法的输入:
isMeetingDay(WeekDays.Wednesday)
ans =
1
在枚举类中定义属性
当必须存储与枚举成员相关的数据时,可向枚举类添加属性。在类构造函数中设置属性值。例如,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.
枚举类构造函数调用顺序
枚举代码块中的每个语句均为枚举成员的名称,其后可跟参数列表。如果枚举类定义了构造函数,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