Main Content

継承した組み込みメソッドの動作

double のサブクラス化

組み込みクラスで使用されるほとんどの組み込み関数は、実際、組み込みクラスのメソッドです。たとえば、double クラスおよび single クラスは、算術演算、インデックス付け、行列演算などを実行するためのいくつかのメソッドを定義します。これらの組み込みクラスのメソッドはすべて、組み込みクラスのサブクラスを取り扱います。

double をサブクラス化することにより、MATLAB® の組み込みクラスで定義されているメソッドを実装せずに、ユーザー クラスで機能を使用できるようになります。

DocSimpleDouble クラスは組み込みの double クラスをサブクラス化します。

classdef DocSimpleDouble < double
   methods
      function obj = DocSimpleDouble(data)
         if nargin == 0
            data = 0;
         end
         obj = obj@double(data);
      end
   end
end

DocSimpleDouble クラスのインスタンスを作成します。

sc = DocSimpleDouble(1:10)
sc = 
   1x10 DocSimpleDouble:
  double data:
     1     2     3     4     5     6     7     8     9    10

sum のような、double クラスから継承され double データを扱うメソッドを呼び出します。sumdouble を返し、したがって、クラス doubledisplay メソッドを使用します。

sum(sc)
ans =
    55

double の配列と同様に、sc にインデックスを付けます。返される値はこのサブクラスのクラスです。

a = sc(2:4)
a = 
  1x3 DocSimpleDouble:
  double data:
     2     3     4

インデックス付きの代入は組み込みクラスと同様に機能します。返される値はこのサブクラスのクラスです。

sc(1:5) = 5:-1:1
sc = 
   1x10 DocSimpleDouble:
  double data:
     5     4     3     2     1     6     7     8     9    10

データ要素の順序を変更するメソッドを呼び出すと、データを操作しますが、サブクラスのオブジェクトを返します。

sc = DocSimpleDouble(1:10);
sc(1:5) = 5:-1:1;
a = sort(sc)
a = 
   1x10 DocSimpleDouble:
  double data:
     1     2     3     4     5     6     7     8     9    10

組み込みデータ値メソッド

サブクラスのオブジェクトで組み込みデータ値メソッドを呼び出すと、MATLAB はサブクラス オブジェクトのスーパークラス部分をメソッドへの入力として使用します。返される値のクラスは組み込みクラスと同じになります。以下に例を示します。

sc = DocSimpleDouble(1:10);
a = sin(sc);
class(a)
ans =

double

組み込みデータ整理メソッド

このグループの組み込みメソッドは、入力引数配列の並べ替えと形を変更します。これらのメソッドは、サブクラス オブジェクトのスーパークラスの部分を処理しますが、サブクラスと同じ型のオブジェクトを返します。

sc = DocSimpleDouble(randi(9,1,10))
sc = DocSimpleDouble(randi(9,1,10))

sc = 

  1x10 DocSimpleDouble:

  double data:
     6     1     8     9     7     7     7     4     6     2
b = sort(sc)
b = 

  1x10 DocSimpleDouble:

  double data:
     1     2     4     6     6     7     7     7     8     9

このグループのメソッドには、以下のものがあります。

組み込みインデックス メソッド

インデックス付けを使用して組み込みクラスから継承するオブジェクトを参照すると、サブクラスが定義したプロパティではなく組み込みデータのみが参照されます。サブクラスがプロパティを定義する場合は、サブクラスが既定の subsref メソッドをオーバーライドしない限り、インデックス付き参照は作成できません。

たとえば、DocSimpleDouble サブクラス オブジェクトの要素 2 にインデックスを付けると、ベクトルの 2 番目の要素を返します。

sc = DocSimpleDouble(1:10);
a = sc(2)
a = 
  DocSimpleDouble
  double data:
     2

インデックス付けの操作から返される値は、サブクラスのオブジェクトです。

DocSimpleDouble オブジェクトの 2 番目の要素に新しい値を割り当てると、スーパークラスのデータだけが処理されます。

sc(2) = 12
sc = 
   1x10 DocSimpleDouble:
  double data:
     1    12     3     4     5     6     7     8     9    10

subsref メソッドは、メソッドに対するドット表記も実装します。

組み込み連結メソッド

組み込み関数は、関数 horzcatvertcatcat を使用して、連結を実装します。同じ型のサブクラス オブジェクトでこれらの関数を使用すると、MATLAB ではスーパークラスのデータが新しい 1 つのオブジェクトに連結されます。たとえば、DocSimpleDouble クラスのオブジェクトを連結できます。

sc1 = DocSimpleDouble(1:10);
sc2 = DocSimpleDouble(11:20);
[sc1,sc2]
ans = 
  1x20 DocSimpleDouble:
  double data:
  Columns 1 through 13
     1     2     3     4     5     6     7     8     9    10    11    12    13
  Columns 14 through 20
    14    15    16    17    18    19    20
[sc1;sc2]
ans = 
  2x10 DocSimpleDouble:
  double data:
     1     2     3     4     5     6     7     8     9    10
    11    12    13    14    15    16    17    18    19    20

3 番目の次元について 2 つのオブジェクトを連結します。

c = cat(3,sc1,sc2)
c = 

  1x10x2 DocSimpleDouble:

  double data:

(:,:,1) =

     1     2     3     4     5     6     7     8     9    10


(:,:,2) =

    11    12    13    14    15    16    17    18    19    20

組み込みクラスのサブクラスでプロパティが定義されている場合、サブクラスのオブジェクトは連結できません。異なるオブジェクトのプロパティをどう結合するかを決定する方法はありません。ただし、サブクラスで独自の horzcat メソッドと vertcat メソッドを定義すれば、サブクラスにとって意味のある方法で連結を行うことができます。

関連するトピック