プロパティをもつ組み込み型のサブクラス
追加のデータ ストレージをもつ特殊な数値型
組み込み数値型をサブクラス化して、組み込み型の機能を継承するカスタマイズされたデータ型を作成します。クラス メソッドを実装して、スーパークラスによって提供された機能に機能を追加するか、または機能を変更します。
プロパティの定義によるサブクラスでの追加データ ストレージの提供は、組み込みデータ クラスの拡張に便利です。ただし、サブクラスにプロパティを追加する場合、サブクラスで標準的な配列の動作を実装するメソッドを定義する必要があります。
詳細については、MATLAB 組み込み型のサブクラスを参照してください。
プロパティをもつサブクラス
組み込みクラスのサブクラスでプロパティが定義されている場合、既定のインデックス付けと連結は機能しません。既定の関数 subsref
、subsasgn
、horzcat
および vertcat
は、不明なプロパティ タイプや値を扱うことができません。このため、サブクラスは、これらのメソッドを実装してその動作を定義しなければなりません。
この ExtendDouble
クラスのサンプル実装は、double
クラスから派生し、1 つのプロパティを定義します。ExtendDouble
クラス定義は、組み込みクラスのサブクラスのインデックス付けと連結を実装する方法を示します。
追加されるプロパティ
ExtendDouble
クラスは、データを記述するテキストを含めるために DataString
プロパティを定義します。このクラスのスーパークラス部分に数値データが格納されます。
実装されるメソッド
次のメソッドは、ExtendDouble
クラスの動作を変更します。
ExtendDouble
— コンストラクターは、プロパティを空の値に初期化する引数なしの構文をサポートします。subsref
— サブクラスのスーパークラスの部分の添字による参照、DataString
プロパティのドット表記による参照、名前Data
を使用した組み込みデータのドット表記による参照を可能にします。subsasgn
— サブクラスのスーパークラスの部分の添字による代入、DataString
プロパティのドット表記による参照、名前Data
を使用した組み込みデータのドット表記による参照を可能にします。horzcat
—ExtendDouble
オブジェクトの水平連結を定義します。double
クラスのhorzcat
メソッドを使用してスーパークラス部分を連結し、DataString
プロパティの cell 配列を形成します。vertcat
—horzcat
と同等の垂直連結 (両方が必要です)。char
—horzcat
とvertcat
で使用される、ExtendDouble
からchar
へのコンバーター。disp
—ExtendDouble
はdisp
メソッドを実装して、オブジェクトにカスタム表示を与えます。
クラス定義コード
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.DataString
—DataString
プロパティにアクセスします。obj.Data
、obj.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.Data
とobj.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
horzcat
と vertcat
は、サブクラスと同じクラスの新しいオブジェクトを返します。