Main Content

組み込みクラスから派生した列挙

組み込みクラスのサブクラス化

列挙クラスは MATLAB® 組み込みクラスをサブクラス化できます。組み込みクラスから列挙クラスを派生すると、列挙メンバーをより有効に使用できるようになります。

  • 列挙は組み込みクラスから機能を継承する。

  • 数値または論理値を列挙メンバーに関連付けることができる。

列挙クラスの基本的な説明については、列挙クラスの定義を参照してください。

数値クラスからの列挙クラスの派生

メモ

組み込みの数値および論理クラスから派生した列挙クラスは、プロパティを定義できません。

列挙クラスが組み込み数値クラスをサブクラス化した場合、このサブクラスは列挙名に適用可能な順序付け演算と算術演算を継承します。

たとえば、Results クラスは組み込みの int32 クラスをサブクラス化します。このクラスは、整数値を 4 つの列挙メンバー、FirstSecondThird および NoPoints のそれぞれに関連付けます。

classdef Results < int32
   enumeration
      First   (100)
      Second  (50)
      Third   (10)
      NoPlace (0)
   end
end

列挙メンバーは int32 クラスのメソッドを継承します (コロン演算子を除く)。これらの列挙型を数値のように使用します (合計する、並べ替える、平均を出す)。

isa(Results.Second,'int32')
ans =

     1

たとえば、以下のように 2 つのチームをランク付けするために、番号の代わりに列挙型名を使用します。

Team1 = [Results.First, Results.NoPlace, Results.Third, Results.Second];
Team2 = [Results.Second, Results.Third, Results.First, Results.First];

これらの Results 列挙型に対して int32 演算を実行します。

sum(Team1)
ans =

   160
mean(Team1)
ans =

    40
sort(Team2,'descend')
ans = 

    First      First      Second     Third  
Team1 > Team2
ans =

     1     0     0     0
sum(Team1) < sum(Team2)
ans =

     1

列挙型インスタンスの作成方法

組み込みクラス (たとえば int32) から派生する列挙クラスを初回に参照したときは、MATLAB は列挙メンバーに関連付けられている入力引数をスーパークラス コンストラクターに渡します。たとえば、以下のように定義されている Second Results メンバーを参照すると

Second (50)

MATLAB は以下を呼び出して

int32(50)

この Results オブジェクトの int32 アスペクトを初期化します。

列挙型名のエイリアス方法

MATLAB 組み込み数値クラスおよび論理クラスから派生した列挙クラスは、基本値に対して複数の名前を定義できます。基本値をもつ列挙型ブロック内の最初の名前はその基本値の実際の名前であり、以降の名前はエイリアスです。

以下のように、実際の名前と同じスーパークラス コンストラクター引数でエイリアス名を指定します。

classdef Bool < logical
   enumeration
      No  (0)
      Yes (1)
      off (0)
      on  (1)
   end
end

たとえば、Bool.off 列挙メンバーのインスタンスの実際の名前は No です。

a = Bool.No
a = 

    No 
b = Bool.off
b = 

    No 

スーパークラス コンストラクターは基本値を出力

列挙メンバーに関連付けられる実際の基本値は組み込みのスーパークラスによって返される値です。たとえば、クラス double をもっているコンストラクター引数によって定義された Bool クラスを検討してみましょう。

classdef Bool < logical
   enumeration
      No  (0)
      Yes (100)
   end
end

このクラスは組み込みの logical クラスから派生しています。そのため、列挙メンバーに対する基本値は、その値が渡されるときの logical が返す値により異なります。

a = Bool.Yes
a = 

    Yes
logical(a)
ans =

     1

数値組み込みクラスのサブクラス化方法

FlowRate 列挙クラスは、LowMediumHigh の 3 つのメンバーを定義します。

classdef FlowRate < int32
   enumeration
      Low    (10)
      Medium (50)
      High   (100)
   end
end

列挙メンバーのインスタンスを参照します。

setFlow = FlowRate.Medium;

このステートメントは、MATLAB に引数値 50 を使用して既定のコンストラクターを呼び出させます。MATLAB は最初のスーパークラスにこの引数を渡します (この例では int32(50))。結果は、FlowRate.Medium メンバーに対する 32 ビット整数として 50 の基本値となります。

FlowRate は組み込み数値クラス (int32) をサブクラス化するので、このクラスはプロパティを定義することができません。ただし、FlowRate は、コンバーター メソッドを含む int32 メソッドを継承します。プログラムは、コンバーターを使用して基本値を取得することができます。

setFlow = FlowRate.Medium;
int32(setFlow)
ans =

          50

既定のコンバーター

列挙値が組み込み数値クラスのサブクラスである場合は、列挙クラスの名前を使用して、組み込み数値データを列挙値に変換することができます。以下に例を示します。

a = Bool(1)
a = 

    Yes

また、列挙クラスは入力引数としてそれ自身のクラスの列挙メンバーを受け入れます。

Bool(a)
ans = 

    Yes

コンバーターは、入力と同じサイズのオブジェクトを返します。

Bool([0,1])
ans = 

    No     Yes

empty 静的メソッドを使用して、空の列挙配列を作成します。

Bool.empty
ans = 

  0x0 empty Boolean enumeration.

関連するトピック