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.CopyableShallowCp— 次のサブクラス: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: 7a.ShallowObj
ans =
ShallowCp with properties:
ShProp: 7ContainsHandles オブジェクトのコピーを作成します。
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 で導入