主要内容

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

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

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

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

详细については,matlab组み込み型サブクラスクラスを参照してください。

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

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

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

追加されるプロパティ

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

実装されるメソッド

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

  • ExtendDouble- コンストラクターは空の値初期する引数の构文をサポートします。

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

  • subsasgn- サブクラススーパーのの添字による,,数据Stringプロパティの表记による参照名前名前数据を使用した組み込みデータのドット表記による参照を可能にします。

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

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

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

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

クラス定義コード

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

classdefExtendDouble < double特性数据Stringendmethods功能OBJ = ExtendDouble(数据,str)ifnargin == 0 data = 0;str ='';elseifnargin == 1 str ='';endobj = obj@double(data); obj.DataString = str;end功能sref = subsref(obj,s)转变s(1).typecase'.'转变s(1).subscase'DataString'sref = obj.datastring;case'数据'd = double(obj);if长度(s)<2 sref = d;elseif长度(s)> 1 && strcmp(s(2).type,'()') sref = subsref(d,s(2:end));end除此以外错误('Not a supported indexing expression')endcase'()'d = double(obj);newd = subsref(d,s(1:end)); sref = ExtendDouble(newd,obj.DataString);case'{}'错误('Not a supported indexing expression')endend功能obj = subsgn(obj,s,b)转变s(1).typecase'.'转变s(1).subscase'DataString'obj.DataString = b;case'数据'if长度(s)<2 obj = estextDouble(b,obj.datastring);elseif长度(s)> 1 && strcmp(s(2).type,'()'d =双(obj);newd = subsasgn (d s(2:结束),b); obj = ExtendDouble(newd,obj.DataString);end除此以外错误('Not a supported indexing expression')endcase'()'d = double(obj);newd = subsasgn(d,s(1),b); obj = ExtendDouble(newd,obj.DataString);case'{}'错误('Not a supported indexing expression')endend功能newobj = horzcat(varargin) d1 = cellfun(@double,varargin,'UniformOutput',false ); data = horzcat(d1{:}); str = horzcat(cellfun(@char,varargin,'UniformOutput',false)); newobj = ExtendDouble(data,str);end功能newobj = vertcat(varargin) d1 = cellfun(@double,varargin,'UniformOutput',false ); data = vertcat(d1{:}); str = vertcat(cellfun(@char,varargin,'UniformOutput',false)); newobj = ExtendDouble(data,str);end功能str =char(obj) str = obj.DataString;end功能disp(obj)disp(obj.datastring)disp(double(obj))endendend

ExtendDouble の使用

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

ed = ExtendDouble(1:10,'One to ten')
ed = One to ten 1 2 3 4 5 6 7 8 9 10

継承メソッド

ExtendDouble双重クラスクラスメソッドを継承しますますますますクラスクラスされれたすべてすべてパブリックパブリックメソッドののリストリスト表示表示表示するするするmethodsを使用します。

methods(double.empty)

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

sum(ed)
ans = 55

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

排序(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数据Stringプロパティにアクセスします。

  • 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 = 1到10 10 9 8 7 6 5 4 3 2 1

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

ed.Data(10:-1:1)
ans = 1到10 10 9 8 7 6 5 4 3 2 1

数据Stringプロパティにアクセスします。

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 = 1至13 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 オブジェクトの連結

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

ed1 = estextdouble([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は、サブクラスと同じクラスの新しいオブジェクトを返します。

関連するトピック