列挙メンバーの非表示
列挙メンバーを非表示にすると、クラス作成者は既存のコードに非互換性を生じさせずに列挙メンバーの名前を変更できます。メンバーを非表示にするには、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).Nameans =
'red'
ans =
'green'
ans =
'blue'