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