Main Content

定义枚举类

枚举类

通过向类定义中添加 enumeration 代码块可创建枚举类。例如,WeekDays 类列举一周中的工作日。

classdef WeekDays
   enumeration
      Monday, Tuesday, Wednesday, Thursday, Friday
   end
end

为了执行以下各节中的 MATLAB® 代码,请将 WeekDays 类定义放在您的路径上的 .m 文件中。

构造枚举成员

使用类名和成员名引用枚举成员:

ClassName.MemberName

例如,将枚举成员 WeekDays.Tuesday 赋给变量 today

today = WeekDays.Tuesday;

todayWeekDays 类的变量:

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

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

相关主题