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 类。
方法
示例
添加 copy 方法
通过添加 matlab.mixin.Copyable 子类,向句柄类中添加一个 copy 方法。
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
handle 类 ShallowCp 不从 matlab.mixin.Copyable 派生,因此没有 copy 方法。
classdef ShallowCp < handle properties ShProp end methods function obj = ShallowCp(val) ... end end end
创建一个 ContainsHandles 对象,其将两个句柄对象包含在其 DeepObj 和 ShallowObj 属性中。
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: 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 中推出