ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

列挙型クラスの定義

列挙型クラス

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                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 クラスは 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 は値クラスなので (これは から派生しない)、クラス コンストラクターのみがプロパティの値を設定できます。

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

関連するトピック