Main Content

列挙メンバーの非表示

列挙メンバーを非表示にすると、クラス作成者は既存のコードに非互換性を生じさせずに列挙メンバーの名前を変更できます。メンバーを非表示にするには、Hidden 属性が設定された enumeration ブロックを作成します。Hidden が設定された enumeration ブロック内に定義されたメンバーは、関数 enumeration を使用して列挙メンバーがクエリされたときに表示されません。

列挙クラスが数値クラスや logical クラスなど他のクラスから派生している場合、各メンバーはそれに関連付けられている値をもつことができます。2 つのメンバーに同じ値が割り当てられている場合、クラス定義で最初に定義されているメンバーが、2 番目のメンバーをマスキングします。どちらの名前も有効な列挙メンバーですが、最初に定義されているほうがプライマリ メンバーです。マスキングを行うと、あるメンバー名の代わりに別のメンバー名を使用することができますが、セカンダリ名をクラス ユーザーから非表示にするわけではありません。

Hidden 属性を使用すると、マスキングされたメンバー名がユーザー ビューから削除されます。たとえば、HighlightColor クラスは、構文の強調色を表す列挙メンバーを定義します。

classdef HighlightColor < int32
    enumeration
        red   (1)
        green (2)
        blue  (3)
    end
end

このクラスの新しいバージョンでは、よりわかりやすいメンバー名を使用しますが、クラスで元のメンバー名 red、green、blue を使用している既存のコードが破損することを避けなければなりません。列挙メンバーに Hidden 属性を使用すると、クラスで元のメンバーが非表示になります。

classdef HighlightColor < int32
    enumeration
        error   (1)
        comment (2)
        keyword (3)
    end
    enumeration (Hidden)
        red   (1)
        green (2)
        blue  (3)
    end
end

元のメンバー名を使用するコードは引き続き動作します。たとえば、非表示となったメンバー HighlightColor.blue への既存の参照は、同じ値で非表示でないメンバー HighlightColor.keyword と互換性があります。

a = HighlightColor.blue
a = 

  HighlightColor enumeration

    keyword
a == HighlightColor.Keyword
ans =

  logical

   1

値を表す列挙メンバーの場合、クラスで最初に定義されているメンバーが、その値のプライマリ メンバーになります。たとえば、HighlightColor クラスでは、keyword がプライマリ メンバー、blue がセカンダリ メンバーで、どちらも値 3 を表します。一般的には、プライマリ メンバーは表示され、セカンダリ メンバーは非表示になります。しかし、クラスの設計上、プライマリ メンバーを非表示にする必要がある場合、セカンダリ メンバーも非表示にしなければなりません。

純粋な列挙型の非表示

純粋な列挙メンバーには基となる値がないため、あるメンバーを別のメンバーの置き換えとして識別する方法がありません。ただし、Hidden 属性を使用することで、メンバーがユーザーに対して表示されないようにしつつ、既に使用されている非表示メンバーとの互換性が失われることを避けることができます。

たとえば、PCComponents クラスは、コンピューターを注文するためのオンライン フォームで使用されている列挙型を定義します。FloppyDrive コンポーネントは旧式ですが、この列挙メンバーを非表示メンバーとしてクラス内に残しておくことができます。フォームでは選択肢のリストから FloppyDrive を除外できますが、クラス作成者はこのメンバーを使用可能なままとすることで、FloppyDrive を参照する既存のフォームを有効なままにできます。

classdef PCComponents
    enumeration
        USBSlots
        CDPlayer
    end
    enumeration (Hidden)
        FloppyDrive
    end
end

非表示の列挙メンバーの検索

クラスのメタデータを使用して、非表示の列挙メンバーに関する情報を検索します。matlab.metadata.EnumerationMember クラスは、列挙メンバーに関する情報を提供します。たとえば、前述の例で使用していた HighlightColor クラスのメタデータにアクセスすると、非表示メンバーの名前を表示できます。

mc =?HighlightColor
mc = 

  Class with properties:

                     Name: 'HighlightColor'
              Description: ''
      DetailedDescription: ''
                   Hidden: 0
                   Sealed: 0
                 Abstract: 0
              Enumeration: 1
          ConstructOnLoad: 0
         HandleCompatible: 0
          InferiorClasses: [1×1 matlab.metadata.Class]
                Namespace: [0×0 matlab.metadata.Namespace]
                  Aliases: [0×1 string]
     RestrictsSubclassing: 0
             PropertyList: [0×1 matlab.metadata.Property]
               MethodList: [145×1 matlab.metadata.Method]
                EventList: [0×1 matlab.metadata.Event]
    EnumerationMemberList: [6×1 matlab.metadata.EnumerationMember]
           SuperclassList: [1×1 matlab.metadata.Class]]

各列挙メンバーは、EnumerationMemberList プロパティに含まれる matlab.metadata.EnumerationMember オブジェクトによって記述されます。たとえば、配列 EnumerationMemberList の 4 番目の要素は、メンバーの matlab.metadata.EnumerationMember オブジェクトで、名前は red です。

mc.EnumerationMemberList(4)
ans = 

  EnumeratedValue with properties:

                   Name: 'red'
            Description: ''
    DetailedDescription: ''
                 Hidden: 1

すべての非表示メンバーの名前の一覧を表示するには、ハンドル クラスの findobj メソッドを使用します。

 findobj(mc.EnumerationMemberList,'Hidden',true).Name
ans =

    'red'


ans =

    'green'


ans =

    'blue'

参考

|