このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。
列挙クラスの定義
列挙クラス
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 = 1
SyntaxColors
は値クラスなので (これは 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