matlab.mixin.Heterogeneous クラス
名前空間: matlab.mixin
異種混合配列を構成するスーパークラス
説明
matlab.mixin.Heterogeneous
は、異種混合配列の構成をサポートする抽象クラスです。異種混合配列とは、所定のクラスとは異なるオブジェクトの配列で、すべてルート クラスのインスタンスであるか、そこから取得したものです。ルート クラスは、matlab.mixin.Heterogeneous
から直接取得します。
メソッド
保護されたメソッド
matlab.mixin.Heterogeneous.getDefaultScalarElement | 異種混合配列演算に対する既定のオブジェクトを返す |
詳細
異種混合階層
matlab.mixin.Heterogeneous
は、インスタンスを異種混合配列に結合できるクラスの階層を定義するときに使用します。
以下のクラス定義では、HierarchyRoot
から取得したクラスのインスタンスを結合する異種混合配列を構成できます。
classdef HierarchyRoot < matlab.mixin.Heterogeneous % HierarchyRoot is a direct subclass of matlab.mixin.Heterogeneous. % HierarchyRoot is the root of this heterogeneous hierarchy. end
matlab.mixin.Heterogeneous
から直接 HierarchyRoot
クラスを取得すると、HierarchyRoot
クラスがクラス階層のルートになります。この階層のメンバーのインスタンスを異種混合配列に結合できます。有効な異種混合配列を構成するために結合できるのは、同じルート クラスから取得したクラスのインスタンスのみです。
異種混合配列のクラス
異種混合配列のクラスは常に、配列中のすべてのオブジェクトに共通する最も特定的なスーパークラスのクラスとなります。たとえば、以下のクラス階層を定義するとします。
LeafA
のインスタンスと LeafB
のインスタンスを含む配列を構成すると、クラス Middle
の配列が作成されます。
harray = [LeafA LeafB]; class(harray)
ans = Middle
LeafC
のインスタンスと LeafD
のインスタンスを含む配列を構成すると、クラス HierarchyRoot
の配列が作成されます。
harray = [LeafC LeafD]; class(harray)
ans = HierarchyRoot
LeafA
のインスタンスと他の LeafA
のインスタンスを含む配列を構成すると、LeafA
クラスの同種配列が作成されます。
harray = [LeafA LeafA]; class(harray)
ans = LeafA
異種混合配列は、同じ階層ルート (たとえば、前述の階層の HierarchyRoot
クラス) から派生したオブジェクトでのみ構成できます。
複数のスーパークラスから派生したオブジェクトで異種混合配列を構成できますが、その階層にある 1 つの分岐のみが異種混合ルートを定義できます。
異種混合配列は、異種混合階層から 2 つ以上のインスタンスを含む配列を作成する処理の結果です。通常、この処理は連結またはインデックス付き代入です。たとえば、以下のステートメントは、インデックス付き代入を使用して異種混合配列を構成します。
harray(1) = LeafA; harray(2) = LeafC; class(harray)
ans = Middle
配列に matlab.mixin.Heterogeneous
から取得したオブジェクトが含まれている場合、新しいオブジェクトをこの配列に割り当てると、配列のクラスが変化することがあります。たとえば、LeafA
クラスのオブジェクトのみを含む同種配列を考えてみましょう。
harray = [LeafA,LeafA,LeafA]; class(harray)
ans = LeafA
同じルートから取得した別のクラスのオブジェクトを同種配列に追加すると、配列のクラスが最も特定的なスーパークラスに変換されます。
harray(4) = LeafB; class(harray)
ans = Middle
メソッド ディスパッチング
上位引数が異種混合配列であるメソッドを MATLAB® が呼び出す場合、以下のことが必要となります。
このメソッドが、配列のクラスから直接定義するか、またはスーパークラスから継承することにより、この異種混合配列のクラスについて定義されている。
このメソッドが
Sealed = true
である (サブクラスによってオーバーライドされない)。継承されたメソッドをシールする必要がある場合は、「継承されたメソッドのシーリング」を参照してください。
異種混合配列のクラスは、同種配列の場合と同様に、指定したメソッドを呼び出すときに実行するクラス メソッドを決定します。MATLAB は、メソッドにディスパッチするときに、配列中の各要素のクラスを評価しません。
異種混合配列で呼び出されるメソッドの要件が Sealed = true
である場合、すべての配列要素で正しく、予想可能な挙動が確実になります。
異種混合配列外から継承したメソッドが Sealed = true
ではない場合にこれらのメソッドを異種混合配列で呼び出すには、これらのメソッドをオーバーライドしなければなりません。
たとえば、matlab.mixin.Heterogeneous
に加えて、matlab.mixin.SetGet
をサブクラス化して、異種混合配列を定義するとします。クラスの構成に合わせて、set
メソッドをオーバーライドし、matlab.mixin.SetGet
スーパークラスを呼び出します。
classdef HeterogeneousSetGet < matlab.mixin.SetGet & matlab.mixin.Heterogeneous properties P end methods(Sealed) function varargout = set(obj,varargin) [varargout{1:nargout}] = set@matlab.mixin.SetGet(obj,varargin{:}); end end end
メソッドの実装では、異種混合配列 harray
、およびスカラー インデックス n
、式
harray(n)
が異種混合配列でないことを利用できます。したがって、異種混合配列の 1 つの要素でメソッドを呼び出す場合、異種混合配列の特殊要件は適用されません。
既定のオブジェクトの定義
MATLAB の異種混合配列は、配列要素が欠落した状態で作成できます。以下に例を示します。
インデックス付き代入によってギャップのある配列が作成される。たとえば、
harray
がまだ定義されていない場合、以下のようになります。harray(5) = LeafA;
MAT ファイルから異種混合配列を読み込んでいるが、MATLAB が指定のオブジェクトのクラス定義を見つけられない。
このようなケースでは、matlab.mixin.Heterogeneous
クラスはメソッド getDefaultScalarElement
を呼び出し、既定のオブジェクトを作成してギャップを埋めます。このメソッドは、異種混合階層内の matlab.mixin.Heterogeneous
の直接サブクラスである "ルート クラス" のインスタンスを返します。
ルート クラスが抽象である場合、または異種混合階層のクラスでルート クラスが適切な既定のオブジェクトではない場合、getDefaultScalarElement
メソッドをオーバーライドし、ルート クラスから取得したクラスのインスタンスが返るようにできます。
getDefaultScalarElement
メソッドの定義異種混合階層のルート クラスで getDefaultScalarElement
を呼び出す matlab.mixin.Heterogeneous
メソッドをオーバーライドして、既定のオブジェクトのクラスを指定します。getDefaultScalarElement
は、ルート クラスでのみオーバーライドできます。
getDefaultScalarElement
メソッドは、以下のシグネチャを含んでいます。
methods (Static,Sealed,Access = protected) function defaultObject = getDefaultScalarElement ... end end
getDefaultScalarElement
メソッドは、以下の条件を満たさなければなりません。
静的 — MATLAB は、オブジェクトなしでこのメソッドを呼び出します。
保護 — MATLAB はこのメソッドを呼び出しますが、オブジェクト ユーザーは呼び出しません。
シールド (必須ではない) — このメソッドをシールし、異種混合階層のユーザーが、クラスの意図した挙動を変更しないようにします。
スカラー オブジェクトを返せなければなりません。
戻り値はルート クラスの
isa
テストを渡さなければなりません。すなわち、以下のようになります。(isa(getDefaultScalarElement,'HierarchyRoot')
ここで
HierarchyRoot
は異種混合階層ルート クラスの名前です。これは、既定のオブジェクトが、ルート クラスから取得したクラスのインスタンスを取れることを意味します。
インデックス付けまたは連結を再定義できない
異種混合配列では、一貫したインデックス付けと連結挙動が必要です。そのため、matlab.mixin.Heterogeneous
のサブクラスは既定のインデックス付き参照、インデックス付き代入、連結挙動を変更できません。
サブクラスで以下のメソッドをオーバーライドできません。
cat
horzcat
vertcat
subsref
subsasgn
matlab.mixin.Heterogeneous
に加えて、サブクラスからサブクラスを継承する複数継承の場合、サブクラスはこれらのいずれのメソッドも定義できません。
次の形式のステートメントは
a = [obj1 obj2 ...];
大かっこ内に示されたオブジェクトを含む配列 a
を作成します。
同じクラスの Heterogeneous
オブジェクトを連結すると、オブジェクトのクラスが維持され、異種混合配列は作成されません。
同じルート スーパークラスから取得したが、異なるクラスである Heterogeneous
オブジェクトを連結すると、異種混合配列が作成されます。MATLAB は、すべてが同じルート階層の一部である場合、配列メンバーのクラスを変換しません。
次の形式のステートメントは
a(m:n) = [objm ... objn];
割り当ての左側で指定された配列要素 (m:n
) に右側のオブジェクトを割り当てます。
異種混合配列へのインデックス付き代入では、以下のすべてが可能です。
配列のサイズの増減。
既存の配列要素の上書き。
配列内に含まれるオブジェクトのプロパティ値の変更。
配列のクラスの変更。
配列が異種混合かどうかの変更。
次の形式のステートメントは
a = harray(m:n);
インデックス m:n
から配列 a
へ参照される harray
の要素を代入します。
異種混合配列でのインデックス付き参照は、元の配列のサブ範囲を返します。このサブ範囲内 (m:n
) の要素に基づいて、結果は、元の配列と異なるクラスになり、異種混合ではなくなる場合もあります。
非メンバー オブジェクトの変換
同じルート クラスから取得したのではないオブジェクトで異種混合配列を作成しようとした場合、MATLAB は、convertObject
メソッドが存在すればそれを呼び出し、支配クラスにオブジェクトを変換します。convertObject
メソッドを実装すると、異種混合階層の一部ではないオブジェクトを含む異種混合配列が構成できます。
2 つのクラス A
および B
があるとします。ここで、B
は matlab.mixin.Heterogeneous
から取得されず、A
および B
はmatlab.mixin.Heterogeneous
から取得した異なるルート クラスから取得されます。
MATLAB は、以下の場合、A
のルート クラスで実装された convertObject
メソッドを呼び出そうとします。
インデックス付きの代入
A(k) = B
水平および垂直連結
[A B] and [A;B]
[A,B] and [A;B]
異種混合階層でクラスが定義されていないオブジェクトの変換をサポートする場合、convertObject
メソッドを実装します。クラス構成でこの変換が不要な場合は、このメソッドを実装する必要はありません。
convertObject
メソッドを実装できるのは、異種混合階層のルート クラスのみです。
convertObject
メソッドは、以下のシグネチャを含めなければなりません。
methods (Static, Sealed, Access = protected) function cobj = convertObject(DomClass,objToConvert) ... end end
インデックス付き代入 A(k) = B
と連結 [A B]
の場合:
DomClass
は配列A
のクラス名です。objToConvert
は変換するオブジェクト (この場合はB
) です。cobj
はA
が属する異種混合階層の正規メンバーです。
MATLAB は、convertObject
がクラス A
が属する階層にないオブジェクトを返した場合にエラーを発行します。
ハンドル互換性
matlab.mixin.Heterogeneous
クラスはハンドル互換です。このクラスは、複数のスーパークラスを使用してサブクラスを定義するときに、ハンドルまたは値クラスと結合できます。ハンドル互換性については、ハンドル互換クラス を参照してください。
matlab.mixin.Heterogeneous
は値クラスです。値クラスがコピー操作に与える影響については、『MATLAB プログラミングの基礎』ドキュメンテーションのオブジェクトのコピーを参照してください。
バージョン履歴
R2011a で導入
MATLAB コマンド
次の MATLAB コマンドに対応するリンクがクリックされました。
コマンドを MATLAB コマンド ウィンドウに入力して実行してください。Web ブラウザーは MATLAB コマンドをサポートしていません。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)