复制句柄变量会生成另一个引用同一对象的句柄变量。可以通过子类化将复制功能添加到句柄类中matlab.mixin.Copyable
.继承的复制
方法使您能够对类的对象进行浅拷贝。的CopyObj
类显示复制操作的行为。
classdefCopyObj < matlab.mixin.Copyable属性道具结束结束
属性的对象CopyObj
类的句柄行
对象的属性道具
.
a = CopyObj;a.道具=线;
复制对象。
B = copy(a);
确认句柄变量一个
而且b
参考不同的对象。
A == b
Ans =逻辑0
然而,行
引用的对象a.Prop
没有被复制。句柄包含在a.Prop
中的句柄引用与句柄相同的对象b.Prop
.
a.道具== b.道具
Ans =逻辑1
有关复制操作行为的详细信息,请参见复制
.
派生类,自定义句柄对象复制行为matlab.mixin.Copyable
.的matlab.mixin.Copyable
类是派生自句柄类的抽象基类。matlab.mixin.Copyable
提供一个模板,用于定义对象复制操作:
复制
—密封方法,定义复制对象的接口
copyElement
-受保护的方法,子类可以覆盖该方法来自定义子类的对象复制操作
的matlab.mixin.Copyable
复制
方法调用copyElement
方法。子类通过定义自己的版本来自定义复制操作copyElement
.
的默认实现copyElement
对所有非相关属性进行浅拷贝。copyElement
复制每个属性值并将其赋值给新(复制的)属性。如果属性值是句柄对象,copyElement
复制句柄,但不复制底层数据。
要为不同的属性实现不同的复制行为,请重写copyElement
.例如,copyElement
方法SpecializedCopy
类:
创建一个新的类对象
的值。Prop1
到新对象
的默认值重新初始化Prop2
通过在复制时添加时间戳
classdefSpecializedCopy < matlab.mix . copyable属性Prop1 Prop2 = datestr(现在)结束方法(访问=受保护)函数cp = copyyelement (obj) cp = SpecializedCopy;cp.Prop1 = obj.Prop1;cp.Prop2 = datestr(now);结束结束结束
创建该类的对象,并为其赋值Prop1
:
a = SpecializedCopy;a.Prop1 = 7
Prop1: 7 Prop2: '17-Feb-2015 17:51:23'
使用继承的复制
方法创建的副本一个
:
B = copy(a)
b = SpecializedCopy属性:Prop1: 7 Prop2: '17-Feb-2015 17:51:58'
复制(对象)b
)具有相同的值Prop1
,但子类copyElement
方法将新值赋给Prop2
.注意不同的时间戳。
复制一个对象也复制了对象属性的值。对象属性可以包含其他对象,包括句柄对象。如果只是复制包含句柄对象的属性的值,实际上复制的是句柄,而不是对象本身。因此,您的副本引用与原始对象相同的对象。类派生的类matlab.mixin.Copyable
类可以自定义复制方法复制类对象的方式。
假设定义了一个类,该类将句柄存储在对象属性中。您希望能够复制该类的对象,并希望对象的每个副本都引用一个新的句柄对象。使用以下步骤自定义类复制行为:
的子类matlab.mixin.Copyable
.
覆盖copyElement
来控制如何复制包含句柄的属性。
因为属性值是句柄,所以创建一个相同类的新默认对象。
将属性值从原始句柄对象复制到新句柄对象。
的HandleCopy类自定义包含句柄对象的属性的复制操作。的ColorProp类定义要赋值的句柄对象Prop2
:
创建一个对象并分配属性值:
a = HandleCopy;a.Prop1 = 7;a.Prop2 = ColorProp;
方法创建对象的副本复制
继承自matlab.mixin.Copyable
:
B = copy(a);
演示由对象包含的句柄对象一个
而且b
是独立的。改变对象的值一个
不影响对象b
:
a.Prop2。颜色='red'; b.Prop2.Color
Ans =蓝色
的HandleCopy
类自定义该类对象的复制操作。
classdefHandleCopy < matlab.mix . copyable属性Prop1%浅拷贝Prop2%处理副本结束方法(访问=受保护)函数cp = copyElement(obj)%浅拷贝对象cp = copyElement@matlab.mixin.Copyable(obj);从Prop2获取句柄hobj = obj.Prop2;创建默认对象New_hobj = eval(类(hobj));从origin对象中添加公共属性值HandleCopy.propValues (new_hobj hobj);将新对象分配给属性cp.Prop2 = new_hobj;结束结束方法(静态)函数propValues(newObj,orgObj) pl = properties(orgObj);为K = 1:长度(pl)如果isprop (newObj pl {k}) newObj。(pl {k}) = orgObj。(pl {k});结束结束结束结束结束
的ColorProp
类通过为其指定RGB值来定义颜色颜色
财产。
classdefColorProp < handle属性颜色=“蓝”;结束结束
使用NonCopyable
属性,指示您不希望复制操作复制特定属性值。默认情况下,NonCopyable
是假
,表示该属性值是可复制的。你可以设置NonCopyable
来真正的
仅在句柄类的属性上。
派生的类matlab.mixin.Copyable
的默认实现copyElement
荣誉的NonCopyable
属性。因此,如果属性具有NonCopyable
属性设置为真正的
,然后copyElement
不复制该属性的值。如果你重写copyElement
类的子类中,可以选择如何使用NonCopyable
属性。
集NonCopyable
来真正的
在一个属性块中:
属性(NonCopyable) Prop1结束
如果不可复制的属性在类定义中分配了默认值,则复制操作将默认值分配给该属性。例如,CopiedClass
将默认值赋给Prop2
.
classdefCopiedClass < matlab.mix . copyable属性Prop1 Prop2 = datestr(现在)指定当前时间结束结束
创建一个要复制并赋值的对象Prop1
:
a = copyedclass;a.Prop1 = 7
a =复制类的属性:Prop1: 7 Prop2: '17-Feb-2015 15:19:34'
复制一个
来b
使用复制
继承自matlab.mixin.Copyable
:
B = copy(a)
b = copyedclass with properties: Prop1: [] Prop2: '17-Feb-2015 15:19:34'
在副本中b
的值。Prop1
不是复制的。的价值Prop2
设置为默认值,哪个MATLAB®第一次装入类时确定。时间戳不会改变。
类的子类dynamicprops
类允许您向类的对象添加属性。派生类时dynamicprops
的子类matlab.mixin.Copyable
的默认实现copyElement
不复制动态属性。的默认值NonCopyable
是真正的
对于动态属性。
的默认实现copyElement
尊重动态属性的值NonCopyable
属性。如果要允许复制动态属性,请设置其NonCopyable
属性来假
.复制动态属性将复制属性值和属性属性的值。
例如,这个复制操作复制动态属性,DynoProp
,因为它NonCopyable
属性设置为假
.的对象obj
必须是从两者派生的类的实例吗dynamicprops
而且matlab.mixin.Copyable
:
obj =MyDynamicClass;P = addprop(obj,“DynoProp”);p.NonCopyable = false;Obj2 = copy(obj);