主要内容

定义枚举类

枚举类

通过向类定义中添加 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

    Tuesday

todayWeekDays 类的变量:

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

01 属于 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

另请参阅

主题