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