Main Content

プロパティをもつ組み込み型のサブクラス

追加のデータ ストレージをもつ特殊な数値型

組み込み数値型をサブクラス化して、組み込み型の機能を継承するカスタマイズされたデータ型を作成します。クラス メソッドを実装して、スーパークラスによって提供された機能に機能を追加するか、または機能を変更します。

プロパティの定義によるサブクラスでの追加データ ストレージの提供は、組み込みデータ クラスの拡張に便利です。ただし、サブクラスにプロパティを追加する場合、サブクラスで標準的な配列の動作を実装するメソッドを定義する必要があります。

詳細については、MATLAB 組み込み型のサブクラスを参照してください。

プロパティをもつサブクラス

組み込みクラスのサブクラスでプロパティが定義されている場合、既定のインデックス付けと連結は機能しません。既定の関数 subsrefsubsasgnhorzcat および vertcat は、不明なプロパティ タイプや値を扱うことができません。このため、サブクラスは、これらのメソッドを実装してその動作を定義しなければなりません。

この ExtendDouble クラスのサンプル実装は、double クラスから派生し、1 つのプロパティを定義します。ExtendDouble クラス定義は、組み込みクラスのサブクラスのインデックス付けと連結を実装する方法を示します。

追加されるプロパティ

ExtendDouble クラスは、データを記述するテキストを含めるために DataString プロパティを定義します。このクラスのスーパークラス部分に数値データが格納されます。

実装されるメソッド

次のメソッドは、ExtendDouble クラスの動作を変更します。

  • ExtendDouble — コンストラクターは、プロパティを空の値に初期化する引数なしの構文をサポートします。

  • subsref — サブクラスのスーパークラスの部分の添字による参照、DataString プロパティのドット表記による参照、名前 Data を使用した組み込みデータのドット表記による参照を可能にします。

  • subsasgn — サブクラスのスーパークラスの部分の添字による代入、DataString プロパティのドット表記による参照、名前 Data を使用した組み込みデータのドット表記による参照を可能にします。

  • horzcatExtendDouble オブジェクトの水平連結を定義します。double クラスの horzcat メソッドを使用してスーパークラス部分を連結し、DataString プロパティの cell 配列を形成します。

  • vertcathorzcat と同等の垂直連結 (両方が必要です)。

  • charhorzcatvertcat で使用される、ExtendDouble から char へのコンバーター。

  • dispExtendDoubledisp メソッドを実装して、オブジェクトにカスタム表示を与えます。

クラス定義コード

ExtendDouble クラスは、double を拡張して、添字によるインデックス付けと連結をサポートするメソッドを実装します。

classdef ExtendDouble < double
   
   properties
      DataString
   end
   
   methods
      function obj = ExtendDouble(data,str)
         if nargin == 0
            data = 0;
            str = '';
         elseif nargin == 1
            str = '';
         end
         obj = obj@double(data);
         obj.DataString = str;
      end
      
      function sref = subsref(obj,s)
         switch s(1).type
            case '.'
               switch s(1).subs
                  case 'DataString'
                     sref = obj.DataString;
                  case 'Data'
                     d = double(obj);
                     if length(s)<2
                        sref = d;
                     elseif length(s)>1 && strcmp(s(2).type,'()')
                        sref = subsref(d,s(2:end));
                     end
                  otherwise
                     error('Not a supported indexing expression')
               end
            case '()'
               d = double(obj);
               newd = subsref(d,s(1:end));
               sref = ExtendDouble(newd,obj.DataString);
            case '{}'
               error('Not a supported indexing expression')
         end
      end
      
      function obj = subsasgn(obj,s,b)
         switch s(1).type
            case '.'
               switch s(1).subs
                  case 'DataString'
                     obj.DataString = b;
                  case 'Data'
                     if length(s)<2
                        obj = ExtendDouble(b,obj.DataString);
                     elseif length(s)>1 && strcmp(s(2).type,'()')
                        d = double(obj);
                        newd = subsasgn(d,s(2:end),b);
                        obj = ExtendDouble(newd,obj.DataString);
                     end
                  otherwise
                     error('Not a supported indexing expression')
               end
            case '()'
               d = double(obj);
               newd = subsasgn(d,s(1),b);
               obj = ExtendDouble(newd,obj.DataString);
            case '{}'
               error('Not a supported indexing expression')
         end
      end
      
      function newobj = horzcat(varargin)
         d1 = cellfun(@double,varargin,'UniformOutput',false );
         data = horzcat(d1{:});
         str = horzcat(cellfun(@char,varargin,'UniformOutput',false));
         newobj = ExtendDouble(data,str);
      end
      
      function newobj = vertcat(varargin)
         d1 = cellfun(@double,varargin,'UniformOutput',false );
         data = vertcat(d1{:});
         str = vertcat(cellfun(@char,varargin,'UniformOutput',false));
         newobj = ExtendDouble(data,str);
      end
      
      function str = char(obj)
         str = obj.DataString;
      end
      
      function disp(obj)
         disp(obj.DataString)
         disp(double(obj))
      end
   end
end

ExtendDouble の使用

ExtendDouble のインスタンスを作成し、表示が既定とは異なることに注目します。

ed = ExtendDouble(1:10,'One to ten')
ed = 

One to ten
     1     2     3     4     5     6     7     8     9    10

継承メソッド

ExtendDouble クラスは、double クラスからメソッドを継承します。double クラスによって定義されたすべてのパブリック メソッドのリストを表示するには、関数 methods を使用します。

methods(double.empty)

関数 sum は、オブジェクトのスーパークラス部分の演算を続けます。

sum(ed)
ans =
    55

関数 sort は、オブジェクトのスーパークラス部分を処理します。

sort(ed(10:-1:1))
ans = 

     1     2     3     4     5     6     7     8     9    10

算術演算子は、オブジェクトのスーパークラス部分を処理します。

ed.^2
ans =

     1     4     9    16    25    36    49    64    81   100

添字インデックス

ExtendDouble クラスはプロパティを定義するため、クラスは独自の subsref メソッドと subsasgn メソッドを実装しなければなりません。

このクラスは、参照および代入用に以下の添字インデックス式を実装します。

  • obj.DataStringDataString プロパティにアクセスします。

  • obj.Dataobj.Data(ind) — プロパティ スタイルの参照を使用してデータにアクセスします。参照は double 型の値を返します。

  • obj(ind) — 数値データにアクセスします (obj.Data(ind) と同じです)。参照は ExtendDouble 型の値を返します。

クラス subsref メソッドにより、数値配列などの ExtendDouble オブジェクトを使用して数値データの参照が可能になります。

ed = ExtendDouble(1:10,'One to ten');
ed(10:-1:1)
ans = 

One to ten
    10     9     8     7     6     5     4     3     2     1

任意に選択した名前 Data を指定したプロパティ スタイルのインデックスを使用して、ExtendDouble の数値データにアクセスします。

ed.Data(10:-1:1)
ans = 

One to ten
    10     9     8     7     6     5     4     3     2     1

DataString プロパティにアクセスします。

ed.DataString
ans =

One to ten

添字を使用した代入では、クラスの subsasgn メソッドの類似の構文を実装します。

ed = ExtendDouble(1:10,'One to ten');
ed(11:13) = [11,12,13];
ed.DataString = 'one to thirteen';
ed
ed = 

One to thirteen'
     1     2     3     4     5     6     7     8     9    10    11    12    13

ExtendDouble は、double クラスからコンバーター メソッドを継承します。たとえば、MATLAB®char メソッドを呼び出して、この代入ステートメントを実行します。

ed(11:13) = ['a','b','c']
ed = 

one to thirteen
     1     2     3     4     5     6     7     8     9    10    97    98    99

インデックス式によって返された値のクラス

ExtendDouble は、subsref メソッドに以下の 2 つの形式のインデックス付き参照を実装します。

  • obj.Dataobj.Data(ind)double クラスの戻り値

  • obj(ind)ExtendDouble クラスの戻り値

たとえば、以下の式によって返された値を比較します。

ed = ExtendDouble(1:10,'One to ten');
a = ed(1)
a = 

One to ten
     1
b = ed.Data(1)
b =

     1
whos
  Name      Size            Bytes  Class           Attributes

  a         1x1               132  ExtendDouble              
  b         1x1                 8  double                    
  ed        1x10              204  ExtendDouble              

ExtendDouble クラスでのインデックス付き参照の実装の柔軟性が増しています。

ExtendDouble オブジェクトの連結

次の 2 つのオブジェクトを作成します。

ed1 = ExtendDouble([1:10],'One to ten');
ed2 = ExtendDouble([10:-1:1],'Ten to one');

これらのオブジェクトを水平次元に沿って連結します。

hcat = [ed1,ed2]
hcat = 

    'One to ten'    'Ten to one'

  Columns 1 through 13

     1     2     3     4     5     6     7     8     9    10    10     9     8

  Columns 14 through 20

     7     6     5     4     3     2     1
whos
  Name      Size            Bytes  Class           Attributes

  ed1       1x10              204  ExtendDouble              
  ed2       1x10              204  ExtendDouble              
  hcat      1x20              528  ExtendDouble 

垂直の連結も同様に動作します。

vcat = [ed1;ed2]
vcat = 

    'One to ten'    'Ten to one'

     1     2     3     4     5     6     7     8     9    10
    10     9     8     7     6     5     4     3     2     1

horzcatvertcat は、サブクラスと同じクラスの新しいオブジェクトを返します。

関連するトピック