matlab.mixin.Copyable クラス
名前空間: matlab.mixin
ハンドル オブジェクトのコピー機能を提供するスーパークラス
説明
matlab.mixin.Copyable
クラスは、ハンドル オブジェクトをコピーする copy
メソッドを提供する抽象ハンドル クラスです。copy
メソッドはオブジェクトのシャロー コピーを作成します (つまり、非依存プロパティをすべてソース オブジェクトからコピー先オブジェクトにシャロー コピーする)。MATLAB® はプロパティ値に含まれるいずれのハンドルについても再帰的に copy
を呼び出しません。
copy
メソッドを継承するハンドル クラスを定義するには、matlab.mixin.Copyable
をサブクラス化します。copy メソッドは、クラス コンストラクター関数またはプロパティの set 関数を呼び出さずにデータをコピーします。したがって、副作用はありません。
サブクラスを matlab.mixin.Copyable
から派生させ、copyElement
メソッドをオーバーライドすることにより、コピー動作をカスタマイズできます。詳細については、例 サブクラスのコピー動作のカスタマイズを参照してください。
matlab.mixin.Copyable
クラスは handle
クラスです。
メソッド
例
コピー メソッドの追加
matlab.mixin.Copyable
をサブクラス化して、ハンドル クラスにコピー メソッドを追加します。
classdef MyClass < matlab.mixin.Copyable properties Prop end end
オブジェクトを作成します。
a = MyClass;
オブジェクトのコピーを作成します。
b = copy(a);
詳細については、ハンドル クラスのコピーの実装を参照してください。
サブクラスのコピー動作のカスタマイズ
copy
メソッドは、オーバーライド不可のコピー動作のパブリック インターフェイスを提供します。このメソッドは、入力としてオブジェクトの配列を受け取り、同じ次元数の配列を返します。
copyElement
は保護されたメソッドであり、copy
メソッドで使用して入力配列の各オブジェクトのコピー処理を実行します。サブクラス内の copyElement
をオーバーライドして、継承した copy
メソッドの動作をカスタマイズできます。
コピー操作で特定のプロパティ値をコピーするかどうかの制御を行うには、プロパティの NonCopyable
属性を使用します。
この例では、matlab.mixin.Copyable
のサブクラスの copyElement
メソッドをオーバーライドして、handle
オブジェクトの特定のクラスのディープ コピーを実装します。
次のクラスを考えます。
ContainsHandles
— 2 つのプロパティにhandle
オブジェクトを含むmatlab.mixin.Copyable
のサブクラスDeepCp
— 次のサブクラス:matlab.mixin.Copyable
ShallowCp
— 次のサブクラス:handle
ここに簡略化したクラス定義を示します。
classdef ContainsHandles < matlab.mixin.Copyable properties Prop1 Prop2 DeepObj % Contains a DeepCp object ShallowObj % Contains a ShallowCp object end methods function obj = ContainsHandles(val1,val2,deepobj,shallowobj) if nargin > 0 obj.Prop1 = val1; obj.Prop2 = val2; obj.DeepObj = deepobj; obj.ShallowObj = shallowobj; end end end methods(Access = protected) % Override copyElement method: function cpObj = copyElement(obj) % Make a shallow copy of all four properties cpObj = copyElement@matlab.mixin.Copyable(obj); % Make a deep copy of the DeepCp object cpObj.DeepObj = copy(obj.DeepObj); end end end
クラス DeepCp
は matlab.mixin.Copyable
から派生します。
classdef DeepCp < matlab.mixin.Copyable properties DpProp end methods function obj = DeepCp(val) ... end end end
handle
クラス ShallowCp
は matlab.mixin.Copyable
から派生しないため、copy
メソッドがありません。
classdef ShallowCp < handle properties ShProp end methods function obj = ShallowCp(val) ... end end end
DeepObj
プロパティと ShallowObj
プロパティに 2 つのハンドル オブジェクトを含む、ContainsHandles
オブジェクトを作成します。
sc = ShallowCp(7); dc = DeepCp(7); a = ContainsHandles(4,5,dc,sc); a.DeepObj
ans = DeepCp with properties: DpProp: 7
a.ShallowObj
ans = ShallowCp with properties: ShProp: 7
ContainsHandles
オブジェクトのコピーを作成します。
b = copy(a);
返されたコピー b
にはオブジェクト sc
のシャロー コピーとオブジェクト dc
のディープ コピーが含まれます。つまり、ContainsHandles
コンストラクターに渡された dc
オブジェクトはコピー処理の結果、新しい独立オブジェクトになりました。コピーに影響せずに dc
オブジェクトを変更できます。シャロー コピーされたオブジェクト sc
には、これがあてはまりません。
ハンドル オブジェクトのプロパティ値を変更します。
sc.ShProp = 5; dc.DpProp = 5;
ディープ コピーされたオブジェクトは影響を受けないことに注意してください。
b.DeepObj
ans = DeepCp with properties: DpProp: 7
シャロー コピーされたオブジェクトは、引き続き同じデータを参照します。
b.ShallowObj
ans = ShallowCp with properties: ShProp: 5
スーパークラス内の copyElement
メソッドはサブクラスのプライベート データにアクセスできません。
matlab.mixin.Copyable
のサブクラスの copyElement
をオーバーライドして、このサブクラスをスーパークラスとして使用する場合、プライベート プロパティを含むすべてのサブクラスで copyElement
をオーバーライドする必要があります。サブクラス内の copyElement
のオーバーライドによって、該当するスーパークラスの copyElement
が以前の例のように呼び出されます。
次の簡略化されたコードは、この処理方法を示しています。
classdef SuperClass < matlab.mixin.Copyable properties(Access = private) super_prop end methods ... function cpObj = copyElement(obj) ... cpObj = copyElement@matlab.mixin.Copyable(obj); ... end end end classdef SubClass1 < SuperClass properties(Access=private) sub_prop1 end methods function cpObj = copyElement(obj) % Copy super_prop cpObj = copyElement@SuperClass(obj); % Copy sub_prop1 in subclass % Assignment can introduce side effects cpObj.sub_prop1 = obj.sub_prop1; end end end
SubClass1
での copyElement
のオーバーライドにより、スーパークラスはサブクラス内のプライベート データにアクセスできないため、プライベート サブクラスのプロパティがコピーされます。
メモ
SubClass1
の copyElement
のオーバーライドでの sub_prop1
の割り当てによって、プロパティの set メソッドが呼び出され (存在する場合)、コピー処理に副作用が生じます。
次の形式の matlab.mixin.Copyable
copy
メソッドの呼び出しを考えます。
B = copy(A);
この copy
の呼び出しにより、次の条件ごとに対応する結果が生成されます。
A
にはダイナミック プロパティがある —copy
ダイナミック プロパティをコピーしません。必要に応じて、サブクラスにダイナミック プロパティのコピーを実装できます。A
に非依存プロパティがない —copy
は、副作用を回避するためにクラス コンストラクターを呼び出さずに、プロパティ値のない新規オブジェクトを作成します。A
に削除されたハンドルがある —copy
は出力配列に同じクラスの削除されたハンドルを作成します。A
に接続されたリスナーがある —copy
はリスナーをコピーしません。A
に列挙型クラスのオブジェクトがある — 列挙型クラスはmatlab.mixin.Copyable
のサブクラスにできません。delete
メソッドがcopy
を呼び出す —copy
は正式なコピーを作成し、その他の使用に適用されるすべての動作に従います。
メモ
列挙型クラスを matlab.mixin.Copyable
から派生させることはできません。作成できるインスタンスは列挙型ブロック内で定義されたインスタンスに限られるためです。列挙型クラスの詳細は、列挙クラスの定義を参照してください。
詳細
バージョン履歴
R2011a で導入