为处理类实施副本

句柄类的复制方法

复制一个句柄变量会产生另一个引用同一对象的句柄变量。可以通过子类化将复制功能添加到句柄类中matlab.mixin.copeable.。继承的复制方法使您能够创建类对象的浅副本。这CopyObj类显示复制操作的行为。

Classdef.CopyObj < matlab.mixin.Copyable属性道具结尾结尾

创建一个对象CopyObj类的句柄并赋值对财产的反对道具

a = copyobj;A.Prop =行;

复制对象。

b =副本(a);

确认句柄变量一种B.参考不同的对象。

a = =
逻辑0

然而所指对象A.Prop.尚未复制。把手包含在A.Prop.中包含的句柄引用同一对象B.Prop.

A.Prop == B.Prop.
逻辑1

有关复制操作行为的更详细信息,请参阅复制

自定义复制操作

通过派生类自定义句柄对象复制行为matlab.mixin.copeable.。这matlab.mixin.copeable.类是从句柄类派生出来的抽象基类。matlab.mixin.copeable.提供自定义对象复制操作的模板,方法如下:

  • 复制- 密封方法,用于定义复制对象的接口

  • CopyElement.-受保护的方法,子类可以重写该方法来自定义子类的对象复制操作

matlab.mixin.copeable.复制方法,拨打电话CopyElement.方法。您的子类通过定义自己的版本来定制复制操作CopyElement.

的默认实现CopyElement.创建所有非依赖属性的浅拷贝。CopyElement.复制每个属性值并将其分配给新的(复制的)属性。如果属性值是句柄对象,CopyElement.复制句柄,但不是底层数据。

实现不同属性的不同拷贝行为,覆盖CopyElement.。例如,CopyElement.的方法专业综合性班级:

  • 创建一个新的类对象

  • 复制价值Prop1到新对象

  • 重新初始化默认值Prop2通过添加复制时的时间戳

Classdef.SpecializedCopy < matlab.mixin.Copyable属性prop1 prop2 = datestr(现在)结尾方法(访问=保护)函数cp = copelement (obj) cp = SpecializedCopy;cp.Prop1 = obj.Prop1;cp.Prop2 = datestr(现在);结尾结尾结尾

创建类的对象并为其分配值Prop1

一个= SpecializedCopy;A.Prop1 = 7.
a =具有属性的专业化文件:prop1:7 prop2:'17 -feb-2015 17:51:23'

使用遗传复制方法创建副本一种

b =复制(a)
b = SpecializedCopy with properties: Prop1: 7 Prop2: '17-Feb-2015 17:51:58'

复制(对象B.)具有相同的价值Prop1,而是子类CopyElement.方法为新值分配给Prop2。注意不同的时间戳。

复制包含句柄的属性

复制对象还将复制对象属性的值。对象属性可以包含其他对象,包括句柄对象。如果只需复制包含句柄对象的属性的值,则实际上是复制句柄,而不是对象本身。因此,您的副本将与原始对象的相同对象引用。从中获得的课程matlab.mixin.copeable.类可以自定义复制方法复制类对象的方式。

支持句柄复制的类万博1manbetx

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

  • 创建一个子类matlab.mixin.copeable.

  • 覆盖CopyElement.控制如何复制包含句柄的属性。

  • 因为属性值是句柄,所以创建一个相同类的新默认对象。

  • 将原始句柄对象的属性值复制到新句柄对象。

手抄品类自定义包含句柄对象的属性的复制操作。这ColorProp.类定义要赋值的句柄对象Prop2

创建一个对象并分配属性值:

一个= HandleCopy;a.Prop1 = 7;a.Prop2 = ColorProp;

方法复制对象复制方法继承自matlab.mixin.copeable.

b =副本(a);

证明对象包含的句柄对象一种B.是独立的。更改对象的值一种不影响对象B.

a.Prop2。颜色='red'; b.Prop2.Color
ans =蓝色

手抄品

手抄品类自定义此类对象的复制操作。

Classdef.HandleCopy < matlab.mixin.Copyable属性Prop1%浅拷贝Prop2%句柄副本结尾方法(访问=保护)函数cp = copyElement(obj)%浅拷贝对象cp = copyelement@matlab.mixin.copeable(obj);%从prop2获取句柄hobj = obj.Prop2;创建默认对象new_hobj = eval(类(hobj));从orig对象中添加公共属性值HandleCopy.propValues (new_hobj hobj);将新对象赋值给属性cp.Prop2 = new_hobj;结尾结尾方法(静态)函数propvalues(newobj,orgobj)pl =属性(orgobj);为了k = 1:长度(pl)如果isprop (newObj pl {k}) newObj。(pl {k}) = orgObj。(pl {k});结尾结尾结尾结尾结尾

ColorProp.

ColorProp.类通过给其赋一个RGB值来定义颜色颜色财产。

Classdef.colorprop 属性颜色=“蓝”结尾结尾

从副本中排除属性

使用不可能属性属性表示您不希望复制操作复制特定属性值。默认情况下,不可能错误的,表示属性值是可复制的。你可以设置不可能真正的仅在句柄类的属性上。

对于派生的课程matlab.mixin.copeable.的默认实现CopyElement.荣誉不可能属性。因此,如果属性有其不可能属性设置为真正的, 然后CopyElement.不会复制该属性的值。如果你覆盖CopyElement.在子类中,可以选择如何使用不可能属性。

设置属性为“不复制”

不可能真正的在属性块中:

属性(非特性)PROP1结尾

默认值

如果未复制的属性具有在类定义中分配的默认值,则复制操作将默认值分配给属性。例如,copiedclass.分配默认值Prop2

Classdef.copiedclass 属性(不可复制)Prop1 Prop2 = datestr(now)%分配当前时间结尾结尾

创建要复制并赋值的对象Prop1

a = copiedclass;A.Prop1 = 7.
a =具有属性的copiedclass:prop1:7 prop2:'17 -feb-2015 15:19:34'

复制一种B.使用复制方法继承自matlab.mixin.copeable.

b =复制(a)
b =具有属性的CopiedClass:prop1:[] prop2:'17 -feb-2015 15:19:34'

在复制B., 的价值Prop1没有复制。的价值Prop2被设置为其默认值,Matlab®首次加载类时确定。时间戳不会改变。

具有动态属性的对象

子类的dynamicprops类允许您为类的对象添加属性。当一个阶级派生dynamicprops也是一个子类matlab.mixin.copeable.的默认实现CopyElement.不复制动态属性。默认值不可能真正的用于动态属性。

的默认实现CopyElement.尊重动态财产的价值不可能属性。如果要允许动态属性的复制,请设置其不可能属性来错误的。复制动态属性复制属性值和属性属性的值。

例如,此副本操作复制了动态属性,DynoProp, 因为它是不可能属性设置为错误的。的对象obj必须是派生于两者的类的实例dynamicpropsmatlab.mixin.copeable.

obj =MyDynamicClass;p = addprop (obj,'dynoprop');p.noncopyable = false;obj2 = copy(obj);

也可以看看

相关的话题