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は異種混合階層ルート クラスの名前です。これは、既定のオブジェクトが、ルート クラスから取得したクラスのインスタンスを取れることを意味します。
Heterogeneous 配列を使用したインデックス付けおよび連結の動作は、基本的には MATLAB における通常のインデックス付け動作と同様ですが、いくつかの例外があります。
次の形式のステートメントは
a(m:n) = [objm ... objn];
割り当ての左側で指定された配列要素 (m:n) に右側のオブジェクトを割り当てます。
異種混合配列へのインデックス付き代入では、以下のすべてが可能です。
配列のサイズの増減。
既存の配列要素の上書き。
配列内に含まれるオブジェクトのプロパティ値の変更。
配列のクラスの変更。
配列が異種混合かどうかの変更。
次の形式のステートメントは
a = harray(m:n);
インデックス m:n から配列 a へ参照される harray の要素を代入します。
異種混合配列でのインデックス付き参照は、元の配列のサブ範囲を返します。このサブ範囲内 (m:n) の要素に基づいて、結果は、元の配列と異なるクラスになり、異種混合ではなくなる場合もあります。
次の形式のステートメントは
a = [obj1 obj2 ...];
大かっこ内に示されたオブジェクトを含む配列 a を作成します。
同じクラスの Heterogeneous オブジェクトを連結すると、オブジェクトのクラスが維持され、異種混合配列は作成されません。
同じルート スーパークラスから取得したが、異なるクラスである Heterogeneous オブジェクトを連結すると、異種混合配列が作成されます。MATLAB は、すべてが同じルート階層の一部である場合、配列メンバーのクラスを変換しません。
異種混合配列では、一貫したインデックス付けと連結挙動が必要です。そのため、matlab.mixin.Heterogeneous のサブクラスは既定のインデックス付け動作または連結動作を変更できません。
異種混合配列内のクラスは、以下の mixin クラスから継承できません。
matlab.mixin.indexing.RedefinesParenmatlab.mixin.indexing.RedefinesDotmatlab.mixin.indexing.RedefinesBrace
サブクラスで以下のメソッドをオーバーライドすることもできません。
cathorzcatvertcatsubsrefsubsasgn
matlab.mixin.Heterogeneous に加えて、スーパークラスからサブクラスを継承する多重継承が含まれる場合、スーパークラスはこれらのいずれの mixins からも継承できず、これらのいずれのメソッドもオーバーロードすることはできません。
同じルート クラスから取得したのではないオブジェクトで異種混合配列を作成しようとした場合、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 Command
You clicked a link that corresponds to this MATLAB command:
Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.
Web サイトの選択
Web サイトを選択すると、翻訳されたコンテンツにアクセスし、地域のイベントやサービスを確認できます。現在の位置情報に基づき、次のサイトの選択を推奨します:
また、以下のリストから Web サイトを選択することもできます。
最適なサイトパフォーマンスの取得方法
中国のサイト (中国語または英語) を選択することで、最適なサイトパフォーマンスが得られます。その他の国の MathWorks のサイトは、お客様の地域からのアクセスが最適化されていません。
南北アメリカ
- América Latina (Español)
- Canada (English)
- United States (English)
ヨーロッパ
- 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)