Main Content

matlab.mixin.Copyable 类

命名空间: matlab.mixin

为句柄对象提供复制功能的超类

描述

matlab.mixin.Copyable 类是一个为复制句柄对象提供 copy 方法的抽象句柄类。copy 方法创建对象的浅拷贝(即将所有非从属属性以浅拷贝形式从源对象复制到目标对象)。MATLAB® 不会以递归方式对属性值中包含的任何句柄调用 copy

子类 matlab.mixin.Copyable,用于定义继承 copy 方法的句柄类。copy 方法在不调用类构造函数或属性集函数的情况下复制数据。因此,它不会产生副作用。

子类可以通过从 matlab.mixin.Copyable 派生并覆盖 copyElement 方法来自定义复制行为。有关详细信息,请参阅示例自定义子类复制行为

matlab.mixin.Copyable 类是一个 handle 类。

类属性

Abstract
true
ConstructOnLoad
true
HandleCompatible
true

有关类属性的信息,请参阅类属性

方法

全部展开

示例

添加复制方法

通过添加 matlab.mixin.Copyable 子类,向句柄类中添加一个复制方法。

classdef MyClass < matlab.mixin.Copyable
   properties
      Prop
   end
end

创建一个对象。

a = MyClass;

创建该对象的副本。

b = copy(a);

有关详细信息,请参阅Implement Copy for Handle Classes

自定义子类复制行为

copy 方法提供公共且不可覆盖的复制行为接口。此方法采用对象数组作为输入并返回相同维度的数组。

copyElement 是一个受保护方法,copy 方法使用该方法对输入数组中的每个对象执行复制操作。您可以在子类中覆盖 copyElement 以自定义继承的 copy 方法的行为。

使用属性的 NonCopyable 特性来控制复制操作是否复制特定的属性值。

实现可选择的深拷贝

此示例在 matlab.mixin.Copyable 的子类中覆盖 copyElement 方法以实现 handle 对象的特定类的深拷贝。

考虑以下类:

  • ContainsHandles - matlab.mixin.Copyable 的子类,将 handle 对象包含在两个属性中

  • 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

handleShallowCp 不从 matlab.mixin.Copyable 派生,因此没有 copy 方法。

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

创建一个 ContainsHandles 对象,其将两个句柄对象包含在其 DeepObjShallowObj 属性中。

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 中推出