列挙クラスの定義
列挙クラス
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 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 =
1SyntaxColors は値クラスなので (これは handle から派生しない)、クラス コンストラクターのみがプロパティの値を設定できます。
e.R = 0
You cannot set the read-only property 'R' of SyntaxColors.
プロパティを定義する列挙クラスの詳細については、可変ハンドルと不変値の列挙メンバーを参照してください。
列挙クラス コンストラクターの呼び出しシーケンス
列挙ブロック内の各ステートメントは、列挙メンバーの名前です (オプションでその後に引数リストが付きます)。列挙クラスがコンストラクターを定義する場合、MATLAB はこのコンストラクターを呼び出して列挙インスタンスを作成します。
MATLAB は、コンストラクターを明示的に定義しないすべての列挙クラスに対して、既定のコンストラクターを提供します。既定のコンストラクターは、以下のように列挙クラスのインスタンスを作成します。
入力引数を使用しない (列挙メンバーが入力引数を定義しない場合)
そのメンバーの列挙クラスで定義されている入力引数を使用する
たとえば、Bool クラスの入力引数は、Bool.No に対しては 0、Bool.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