Main Content

異なるクラスのオブジェクトの連結

基礎知識

この節では、以下の節の情報を理解していることを前提に説明を進めます。

MATLAB の連結規則

MATLAB® は、次の規則に従ってオブジェクトを連結します。

  • MATLAB は、すべてのオブジェクトを常に上位クラスに変換しようとします。

  • ユーザー定義のクラスは組み込みクラス (double など) よりも優先されます。

  • どの 2 つのオブジェクト間にも上下関係が定義されていない場合は、最も左側にあるオブジェクトが最上位になります (クラスの優先順位を参照)。

連結中または添字を使用した代入中に上位クラスに変換する場合、MATLAB は上位クラスと同じ名前の、変換メソッドのための非上位クラスを検索します。そのような変換メソッドが存在する場合、MATLAB はそれを呼び出します。変換メソッドが存在しない場合は、MATLAB は非上位オブジェクトに対して上位クラスのコンストラクターを呼び出します。

上位クラスは、既定の連結処理を変更するhorzcatvertcat または cat メソッドを定義することが可能です。

メモ

MATLAB は、これらのオブジェクトが異種混合階層の一部でない限り、オブジェクトを共通のスーパークラスに変換することはありません。詳細は、異種混合クラス階層の設計を参照してください。

オブジェクトの連結

連結とは、複数のオブジェクトを組み合わせて配列にすることです。以下に例を示します。

ary = [obj1,obj2,obj3];

ary のサイズは 1 行 3 列です。

これらの配列のクラスは、連結したオブジェクトのクラスと同じになります。MATLAB がオブジェクトを上位クラスに変換できる場合は、異なるクラスのオブジェクトの連結が可能となります。MATLAB は次のようにして、異なるクラスのオブジェクトの変換を試みます。

  • 下位オブジェクトのコンバーター メソッドが存在する場合は、これを呼び出します。

  • 下位オブジェクトを上位クラスのコンストラクターに渡し、上位クラスのオブジェクトを作成します。

下位オブジェクトを正常に変換できた場合は、MATLAB によって上位クラスの配列が返されます。変換できなかった場合は、MATLAB はエラーを返します。

上位クラスのコンストラクターの呼び出し

MATLAB は、下位クラスのオブジェクトを上位クラスに変換するために、上位クラスのコンストラクターを呼び出します。MATLAB は下位オブジェクトをコンストラクターに引数として渡します。上位クラスのコンストラクターが下位クラスのオブジェクトを入力引数として受け入れられるようにクラスが設計されている場合は、別のコンバーター メソッドを実装しなくても連結することができます。

コンストラクターがこの引数を単にプロパティに割り当てる場合は、上位クラスのオブジェクトのプロパティに下位クラスのオブジェクトが保存されることになります。この割り当てが目的の結果と異なる場合は、クラス コンストラクターが適切なエラー チェック機能をもつようにします。

たとえば、ColorClass クラス、および RGBColorHSVColor の 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 クラスである場合は、配列 aryHSVColor クラスになり、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

アプリケーションによっては、エラー チェックや他のコーディング手法の追加が必要となることがあります。上記のクラスの例は、一般的な概念を示すことを目的としたものです。

関連するトピック