異なるクラスのオブジェクトの連結
基礎知識
この節では、以下の節の情報を理解していることを前提に説明を進めます。
MATLAB の連結規則
MATLAB® は、次の規則に従ってオブジェクトを連結します。
MATLAB は、すべてのオブジェクトを常に上位クラスに変換しようとします。
ユーザー定義のクラスは組み込みクラス (
double
など) よりも優先されます。どの 2 つのオブジェクト間にも上下関係が定義されていない場合は、最も左側にあるオブジェクトが最上位になります (クラスの優先順位を参照)。
連結中または添字を使用した代入中に上位クラスに変換する場合、MATLAB は上位クラスと同じ名前の、変換メソッドのための非上位クラスを検索します。そのような変換メソッドが存在する場合、MATLAB はそれを呼び出します。変換メソッドが存在しない場合は、MATLAB は非上位オブジェクトに対して上位クラスのコンストラクターを呼び出します。
上位クラスは、既定の連結処理を変更するhorzcat
、vertcat
または cat
メソッドを定義することが可能です。
メモ
MATLAB は、これらのオブジェクトが異種混合階層の一部でない限り、オブジェクトを共通のスーパークラスに変換することはありません。詳細は、異種混合クラス階層の設計を参照してください。
オブジェクトの連結
連結とは、複数のオブジェクトを組み合わせて配列にすることです。以下に例を示します。
ary = [obj1,obj2,obj3];
ary
のサイズは 1 行 3 列です。
これらの配列のクラスは、連結したオブジェクトのクラスと同じになります。MATLAB がオブジェクトを上位クラスに変換できる場合は、異なるクラスのオブジェクトの連結が可能となります。MATLAB は次のようにして、異なるクラスのオブジェクトの変換を試みます。
下位オブジェクトのコンバーター メソッドが存在する場合は、これを呼び出します。
下位オブジェクトを上位クラスのコンストラクターに渡し、上位クラスのオブジェクトを作成します。
下位オブジェクトを正常に変換できた場合は、MATLAB によって上位クラスの配列が返されます。変換できなかった場合は、MATLAB はエラーを返します。
上位クラスのコンストラクターの呼び出し
MATLAB は、下位クラスのオブジェクトを上位クラスに変換するために、上位クラスのコンストラクターを呼び出します。MATLAB は下位オブジェクトをコンストラクターに引数として渡します。上位クラスのコンストラクターが下位クラスのオブジェクトを入力引数として受け入れられるようにクラスが設計されている場合は、別のコンバーター メソッドを実装しなくても連結することができます。
コンストラクターがこの引数を単にプロパティに割り当てる場合は、上位クラスのオブジェクトのプロパティに下位クラスのオブジェクトが保存されることになります。この割り当てが目的の結果と異なる場合は、クラス コンストラクターが適切なエラー チェック機能をもつようにします。
たとえば、ColorClass
クラス、および RGBColor
と HSVColor
の 2 つのサブクラスがあるとします。
classdef ColorClass properties Color end end
クラス RGBColor
は、ColorClass
から Color
プロパティを継承します。RGBColor
は、赤、緑、青 (RGB) の値の 3 要素ベクトルとして定義される色の値を保存します。コンストラクターには、入力引数の値の制限はなく、この値が直接 Color
プロパティに割り当てられます。
classdef RGBColor < ColorClass methods function obj = RGBColor(rgb) if nargin > 0 obj.Color = rgb; end end end end
クラス HSVColor
はまた、ColorClass
から Color
プロパティを継承します。HSVColor
には、色相、彩度、明度 (HSV) の値の 3 要素ベクトルとして定義されるカラー値が保存されます。
classdef HSVColor < ColorClass methods function obj = HSVColor(hsv) if nargin > 0 obj.Color = hsv; end end end end
各クラスのインスタンスを作成して、1 つの配列に連結します。RGBColor
オブジェクトが最も左側にあるオブジェクトで、どちらのクラスも上下関係を定義していないので、このオブジェクトが上位になります。
crgb = RGBColor([1 0 0]); chsv = HSVColor([0 1 1]); ary = [crgb,chsv]; class(ary)
ans = RGBColor
MATLAB では、HSVColor
クラスの下位オブジェクトを上位クラスのコンストラクターに渡すことができるため、これらのオブジェクトを 1 つの配列に連結できます。ただし、配列の 2 番目の RGBColor
オブジェクトの Color
プロパティには、実際には RGB
による色指定ではなく、HSVColor
オブジェクトが含まれています。
ary(2).Color
ans = HSVColor with properties: Color: [0 1 1]
これを防ぐには、次の操作を行います。
コンバーター メソッドの実装
プロパティに値を割り当てる前に、クラス コンストラクターの引数チェックを実行
コンバーター メソッド
クラスの設計でオブジェクトの変換が必要とされる場合は、そのためのコンバーター メソッドを実装します。
ColorClass
クラスは RGBColor
および HSVColor
オブジェクトのコンバーター メソッドを定義します。
classdef ColorClass properties Color end methods function rgbObj = RGBColor(obj) if isa(obj,'HSVColor') rgbObj = RGBColor(hsv2rgb(obj.Color)); end end function hsvObj = HSVColor(obj) if isa(obj,'RGBColor') hsvObj = HSVColor(rgb2hsv(obj.Color)); end end end end
変更したスーパークラスを使用して、RGBColor
オブジェクトと HSVColor
オブジェクトの配列を作成します。
crgb = RGBColor([1 0 0]); chsv = HSVColor([0 1 1]); ary = [crgb,chsv]; class(ary)
ans = RGBColor
MATLAB は、スーパークラスから継承した、HSVColor
オブジェクトのコンバーター メソッドを呼び出します。配列の 2 番目の要素が、Color
プロパティに RGB による色指定が割り当てられた RGBColor
オブジェクトになったことがわかります。
ary(2)
ans = RGBColor with properties: Color: [1 0 0]
ary(2).Color
ans = 1 0 0
最も左側のオブジェクトが HSVColor
クラスである場合は、配列 ary
も HSVColor
クラスになり、MATLAB は Color
プロパティのデータを HSV による色指定に変換します。
ary = [chsv crgb]
ary = 1x2 HSVColor Properties: Color
ary(2).Color
ans = 0 1 1
スーパークラスにコンバーター メソッドを定義し、サブクラス コンストラクターに適切な引数チェックを追加することで、生成される結果の予測がより容易になります。引数チェックを備えた RGBColor
クラス コンストラクターは、次のようになります。
classdef RGBColor < ColorClass methods function obj = RGBColor(rgb) if nargin == 0 rgb = [0 0 0]; else if ~(isa(rgb,'double')... && size(rgb,2) == 3 ... && max(rgb) <= 1 && min(rgb) >= 0) error('Specify color as RGB values') end end obj.Color = rgb; end end end
アプリケーションによっては、エラー チェックや他のコーディング手法の追加が必要となることがあります。上記のクラスの例は、一般的な概念を示すことを目的としたものです。