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 クラスは次のようにして 3 つのプロパティを定義します。クラス コンストラクターは、クラス メンバーを参照したときに、入力引数の値を対応するプロパティに割り当てます。

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 クラスの入力引数は、Bool.No に対しては 0Bool.Yes に対しては 1 です。

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

関連するトピック