異種混合クラス階層の設計
異種混合配列をサポートするクラスの作成
このトピックでは、異種混合配列の形成をサポートするクラスの定義に関する概念について説明します。既存の MATLAB® オブジェクトの連結については、以下のトピックを参照してください。
異種混合配列を使用する例については、異種混合配列のクラス階層を参照してください。
MATLAB 配列
MATLAB は、配列に含まれるオブジェクトのクラスによって配列のクラスを決定します。MATLAB は、オブジェクト ポインターや参照の配列を定義する一部の言語とは異なります。それらの言語では、配列の型は配列内のオブジェクトの型とは異なります。配列の要素にアクセスしてそれらの要素のメソッドにディスパッチすることはできますが、MATLAB でのようにオブジェクト メソッドを配列全体に対し呼び出すことはできません。
MATLAB のオブジェクト配列は同種のクラスから構成されます。この均一性により、数値行列の乗算など、配列全体に操作を実行できます。共通のスーパークラスから派生するクラスの階層を定義することで、異種混合配列を形成できます。cell 配列によって、無関連な各種オブジェクトを保持できる配列タイプというオプションが提供されます。
異種混合階層
共通のスーパークラスのサブクラスであるオブジェクトは、これらのクラスが異種混合階層の一部であるなら、配列を形成することができます。MATLAB の異種混合クラス階層は次のとおりです。
matlab.mixin.Heterogeneous
から直接派生する単一のルート スーパークラスを定義サブクラスによって継承されるメソッドをシール
たとえば、次の図で Shape
は異種混合階層のルートです。
異種混合配列
異種混合配列とは、配列を構成するオブジェクトがその固有のクラスにおいては異なるものの、そのすべてが共通のスーパークラスから派生している、または共通のスーパークラスのインスタンスであるものを言います。共通のスーパークラスは、異種混合配列内に結合させられるクラスの階層のルートを形成します。
共通のスーパークラスは matlab.mixin.Heterogeneous
から派生しなければなりません。配列全体に呼び出すことのできるメソッドは、すべてのサブクラスについて同じ定義をもたなければなりません。
異種混合階層は以下の場面で便利です。
クラスは異なるが、関連する階層の一部であるオブジェクトからなる配列を作成するとき
配列全体で最も特定的な共通スーパークラスのメソッドを呼び出すとき
配列と共にドット表記を使用して、最も特定的な共通スーパークラスのプロパティにアクセスするとき
複数のオブジェクト配列でサポートされる共通の演算子を使用するとき
最も特定的なクラスの配列を返す、配列インデックス付け (スカラーまたは非スカラー) をサポートするとき
異種混合配列の概念
異種混合配列 — 異なる特定のクラスに属する 2 つ以上の要素をもつ配列。すべての要素は同じルート スーパークラスから派生しています。
ルート スーパークラス —
matlab.mixin.Heterogeneous
から直接派生したクラス。ルート スーパークラスは、抽象クラスにも具象クラスにもなり得ます。ルート スーパークラスの具象サブクラスのみが異種混合配列を形成できます。最も特定的な共通スーパークラス — 継承階層において最も特定的なクラスであり、異種混合配列にあるすべてのオブジェクトはこのクラスから派生しています。最も特定的な共通スーパークラスは、ルート スーパークラスか、または現在配列内にあるオブジェクトで共有されている、より詳しく規定されたスーパークラスです。
異種混合配列のクラス — 異種混合配列内にあるすべてのオブジェクトの派生元である、最も特定的な共通スーパークラス。異種混合配列へのオブジェクト追加や、そこからのオブジェクト削除によって、インスタンスによって共有される最も特定的なスーパークラスが変わることがあります。この変化により、異種混合配列のクラスは変化します。最も特定的な共通スーパークラスは抽象クラスとなり得ます。
異種混合配列の特性
この図の異種混合階層は、次の点について異種混合配列の特性を示しています。
配列のクラス
プロパティ アクセス
メソッドの呼び出し
異種混合配列のクラス
異種混合配列のクラスは、配列内のオブジェクトによって共有される最も特定的なスーパークラスのクラスです。
次の条件が当てはまる場合、連結および添字を使用した代入操作により異種混合配列が返されます。
代入ステートメントの右辺にある複数のオブジェクトが異なるクラスに属する
代入ステートメントの右辺にあるすべてのオブジェクトが共通サブクラス
matlab.mixin.Heterogeneous
から派生している
たとえば、これらのクラスのオブジェクトを連結して配列を作成します。a1
のクラスは ClassA
です。
a1 = [SpecificA,SpecificB]; class(a1)
ans = ClassA
配列にクラス SpecificC
のオブジェクトが含まれる場合、a2
のクラスは RootSuperclass
になります。
a2 = [SpecificA,SpecificB,SpecificC]; class(a2)
ans = RootSuperclass
インデックスを使用して配列 a1
にクラス SpecificC
のオブジェクトを割り当てた場合、a1
のクラスは RootSuperclass
になります。
a1(3) = SpecificC; class(a1)
ans = RootSuperclass
配列に 1 つのクラスのオブジェクトしか含まれていない場合、それは異種混合配列ではありません。たとえば、a
のクラスは SpecificA
です。
a = [SpecificA,SpecificA]; class(a)
ans = SpecificA
プロパティ アクセス
配列のクラスでプロパティが定義されている場合は、ドット表記を使用して配列のプロパティにアクセスします。配列のクラスは最も特定的な共通スーパークラスであり、これによって、すべてのオブジェクトによる同じプロパティの継承が保証されます。
たとえば、ClassA
で Prop1
というプロパティが定義されているとします。
a1 = [SpecificA,SpecificB]; a1.Prop1
ドット表記を使用して Prop1
を参照すると、配列内にある各オブジェクトの Prop1
の値が返されます。
メソッドの呼び出し
異種混合配列でメソッドを呼び出すには、配列のクラスでメソッドが Sealed
として定義または継承されていなければなりません。たとえば、RootSuperclass
で superMethod
という Sealed
メソッドを定義するとします。
配列 a2
内のすべてのオブジェクトでメソッドを呼び出します。
a2 = [SpecificA,SpecificB,SpecificC]; a2.superMethod
サブクラスでオーバーライドされないようにメソッドをシールすることで、配列のすべての要素が確実に同じメソッド定義をもちます。配列の 1 つの要素でメソッドを呼び出すと、配列全体でメソッドを呼び出すのと同じメソッド実装が呼び出されます。
サポートされない階層
既定オブジェクトの取得、配列クラスの決定、クラス オブジェクトの他のタイプへの変換において、異種混合階層にあいまいさがあってはなりません。階層のメンバーは 1 つのルート スーパークラスからのみ派生できます (つまり、matlab.mixin.Heterogeneous
の直下のサブクラス 1 つからのみ)。
次の図は許可されない階層構造を示しています。
ClassA
は、matlab.mixin.Heterogeneous
のサブクラスである 2 つのクラスから派生しています。
次の図は、2 つの別々の異種混合階層を示しています。ClassA
には 1 つのルート スーパークラス (OtherBaseClass
) しかありません。この異種混合階層構造はあいまいではありません。
既定のオブジェクト
既定のオブジェクトとは、引数なしでクラス コンストラクターを呼び出したときに返されるオブジェクトです。MATLAB は以下の状況で既定のオブジェクトを使用します。
インデックス付き代入によって、配列要素にギャップのある配列を作成します。たとえば、配列
h
の 1 番目の要素をインデックス5
に代入します。h(5) = ClassA(arg1,arg2);
MATLAB は代入されていない位置を既定のオブジェクトで埋めます。
配列内の特定オブジェクトのクラス定義が利用できない場合に、MAT ファイルから異種混合配列を読み込んだとき。MATLAB はオブジェクトを既定のオブジェクトで置き換えます。
異種混合階層では、その階層の既定のオブジェクトを定義できます。matlab.mixin.Heterogeneous
クラスは、getDefaultScalarElement
を呼び出したメソッドの既定の実装を実行します。このメソッドは、ルート クラスが抽象クラスでない限り、異種混合階層のルート クラスのインスタンスを返します。
ルート スーパークラスが抽象クラスであるか、または既定のオブジェクトとして適切でない場合は、getDefaultScalarElement
メソッドをオーバーライドします。matlab.mixin.Heterogeneous
から直接派生するルート スーパークラスに getDefaultScalarElement
のオーバーライドを実装します。
getDefaultScalarElement
は、ルート スーパークラスから派生したスカラー オブジェクトを返さなければなりません。このメソッドの実装方法の詳細については、matlab.mixin.Heterogeneous.getDefaultScalarElement
を参照してください。
代入時および連結時の変換
同じルート スーパークラスから派生したものではないオブジェクトを含む異種混合配列を作成すると、MATLAB は convertObject
というメソッドを呼び出そうとします。convertObject
を実装してオブジェクトを適切なクラスに変換します。このメソッドは既定では実装されていません。
異種混合階層の一部ではないオブジェクトを使用した異種混合配列の形成をサポートするには、ルート スーパークラスに convertObject
メソッドを実装してください。convertObject
メソッドは、非メンバーのオブジェクトを異種混合階層の有効なメンバーに変換しなければなりません。
convertObject
メソッドの実装の詳細については、matlab.mixin.Heterogeneous
を参照してください。
異種混合の抽象クラスの空配列
同種配列に対して、MATLAB では抽象クラスの空配列の初期化を許可していません。ただし、そのクラスが、異種混合階層の一部である場合、抽象クラスの空配列を初期化できます。空の異種混合配列の初期化は、事前に具象要素のクラスがわからない場合に役立ちます。
たとえば、RootSuperclass
が異種混合階層のルートの抽象クラスとします。empty
静的メソッドを使用して配列を初期化します。
ary = RootSuperclass.empty;