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
类。
方法
示例
添加复制方法
通过添加 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
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: 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 中推出