Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

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 クラスです。

クラスの属性

抽象型
true
ConstructOnLoad
true
HandleCompatible
true

クラス属性の詳細については、クラスの属性を参照してください。

メソッド

すべて展開する

コピー メソッドの追加

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

クラス DeepCpmatlab.mixin.Copyable から派生します。

classdef DeepCp < matlab.mixin.Copyable
   properties
      DpProp
   end
   methods
      function obj = DeepCp(val)
         ...
      end
   end
end

handle クラス ShallowCpmatlab.mixin.Copyable から派生しないため、copy メソッドがありません。

classdef ShallowCp < handle
   properties
      ShProp
   end
   methods
      function obj = ShallowCp(val)
         ...
      end
   end
end

DpProp プロパティと ShProp プロパティに 2 つのハンドル オブジェクトを含む、ContainsHandles オブジェクトを作成します。

sc = ShallowCp(7);
dc = DeepCp(7);
a = ContainsHandles(4,5,dc,sc);
a.DeepObj
ans = 

  DeepCp with properties:

    DpProp: 7
a.ShallowObj.ShProp
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 のオーバーライドにより、スーパークラスはサブクラス内のプライベート データにアクセスできないため、プライベート サブクラスのプロパティがコピーされます。

メモ

SubClass1copyElement のオーバーライドでの 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 で導入