主要内容

实现句柄类的复制

句柄类的复制方法

复制句柄变量会生成另一个引用同一对象的句柄变量。可以通过子类化将复制功能添加到句柄类中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类可以自定义复制方法复制类对象的方式。

支持句柄复制的类金宝app

假设定义了一个类,该类将句柄存储在对象属性中。您希望能够复制该类的对象,并希望对象的每个副本都引用一个新的句柄对象。使用以下步骤自定义类复制行为:

  • 的子类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

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

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);

另请参阅

相关的话题