一个价值类构造函数返回一个与被赋值的变量相关联的对象。如果你重新分配这个变量,MATLAB®创建原始对象的独立副本。如果将此变量传递给函数以修改它,则函数必须将修改后的对象作为输出参数返回。有关价值型行为的信息,请参见避免不必要的数据拷贝.
一个处理类构造函数返回一个句柄对象,该句柄对象是对所创建对象的引用。您可以将句柄对象赋值给多个变量,或将其传递给函数,而无需MATLAB复制原始对象。修改作为输入参数传递的句柄对象的函数不需要返回该对象。
所有句柄类都派生自抽象处理
类。
默认情况下,MATLAB类是值类。下面的定义创建了一个名为MyValueClass
:
classdefMyValueClass...
结束
创建一个处理
类中派生类处理
类。
classdefMyHandleClass <处理...
结束
MATLAB的基本类是值类(数值类,逻辑
,字符
,细胞
,结构体
,函数句柄)。例如,如果你创建一个类的对象int32
并复制这个对象,结果是两个独立的对象。当你改变的值一个
的价值b
不会改变。这种行为是代表值的类的典型行为。
一个= int32 (7);b =一个;= ^ 4;
b 7
MATLAB图形对象被实现为句柄对象,因为它们代表视觉元素。例如,创建一个图形线对象并将其句柄复制到另一个变量。两个变量都指向同一个直线对象。
x = 1:10;y = sin (x);l1 =线(x, y);l2 = l1;
使用句柄的任意一个副本设置行对象的属性。
集(l2,“颜色”,“红色”)设置(l1,“颜色”,“绿色”)
get (l2,“颜色”)
Ans = 0 0
调用删除
功能上的l2
句柄销毁行对象。如果您试图设置颜色
在线属性l1
,集
函数返回错误。
删除(l2)集(l1,“颜色”,“蓝”)
使用matlab.graphics.primitive错误。无效或已删除的对象。
如果通过删除任何一个现有句柄来删除对象,那么所有的副本现在都是无效的,因为您删除了所有句柄指向的单个对象。
删除句柄对象与清除句柄变量不同。在图形对象层次结构中,对象的父对象保存对该对象的引用。例如,父轴持有对被引用的线对象的引用l1
和l2
.如果从工作区中清除这两个变量,对象仍然存在。
有关句柄对象行为的更多信息,请参见处理对象的行为.
MATLAB将值类的对象与赋值对象的变量关联起来。当您将值对象复制到另一个变量或将值对象传递给函数时,MATLAB将创建该对象和该对象包含的所有数据的独立副本。新对象独立于对原始对象的更改。值对象的行为类似于MATLAB的数值和结构体
类。每个属性本质上就像一个MATLAB数组。
值对象总是与一个工作区或临时变量相关联。当值对象的变量超出作用域或被清除时,值对象将超出作用域。没有对值对象的引用,只有独立对象的副本。
下面是一个值类,它将一个值存储在数量
财产。默认的属性值是数字1
.
classdefNumValue属性数量= 1结束结束
创建一个NumValue
对象赋给变量一个
.
一个= NumValue
a = NumValue属性:Number: 1
赋值一个
另一个变量,b
.
b =一个
b = NumValue属性:Number: 1
的变量一个
和b
是独立的。的值数量
的属性一个
不影响数量
的属性b
.
a.Number = 7
a = NumValue属性:Number: 7
b
b = NumValue属性:Number: 1
当您将一个值对象传递给一个函数时,MATLAB会在函数工作区中创建该对象的副本。因为值对象的副本是独立的,所以函数不会在调用者的工作空间中修改对象。因此,修改值对象的函数必须返回修改后的对象,以便在调用者的工作空间中重新分配。
有关更多信息,请参见对象修改.
类派生的类的实例处理
类是对基础对象数据的引用。当复制句柄对象时,MATLAB会复制句柄,但不会复制存储在对象属性中的数据。副本引用与原始句柄相同的对象。如果更改原始对象的属性值,复制的句柄将引用相同的更改。
下面是一个句柄类,它将一个值存储在数量
财产。默认的属性值是数字1
.
classdefNumHandle <处理属性数量= 1结束结束
创建一个NumHandle
赋给变量的对象一个
.
一个= NumHandle
a = NumHandle的属性
赋值一个
另一个变量,b
.
b =一个
b = NumHandle属性:Number: 1
的变量一个
和b
引用相同的底层对象。的值数量
的属性一个
也改变了数量
的属性b
.也就是说,一个
和b
引用同一个对象。
a.Number = 7
a = NumHandle属性:Number: 7
b
b = NumHandle带有属性:Number: 7
当您将句柄对象传递给函数时,MATLAB会在函数工作区中创建句柄的副本。因为句柄的副本引用相同的基础对象,所以修改句柄对象的函数实际上也在调用者的工作空间中修改对象。因此,对于作为输入参数传递的修改句柄对象的函数来说,没有必要将修改后的对象返回给调用者。
有关更多信息,请参见对象修改.
您可以通过显式调用句柄来销毁句柄对象删除
方法。删除句柄类对象的句柄会导致所有句柄无效。例如:
一个= NumHandle;b =一个;删除(a) b.Number
无效或已删除的对象。
调用删除
在句柄对象上调用析构函数或该对象的函数。看到处理类的析构函数为更多的信息。
值对象的相等意味着对象属于相同的类并具有相同的状态。
句柄对象的相等意味着句柄变量引用同一个对象。您还可以标识引用同一类中具有相同状态的不同对象的句柄变量。
要确定值对象是否具有相同的大小以及它们的内容是否具有相同的值,请使用isequal
.例如,使用前面定义的NumValue
类创建两个实例并测试是否相等:
一个= NumValue;b = NumValue;isequal (a, b)
ans = 1
一个
和b
是独立的,因此不是同一对象。然而,每个代表相同的值。
如果更改值对象表示的值,则这些对象不再相等。
一个= NumValue;b = NumValue;b.Number = 7;isequal (a, b)
ans = 0
值类没有默认值情商
方法来实现==
操作。
处理对象继承情商
方法从处理
基类。您可以使用==
和isequal
要测试句柄对象之间的两种不同关系:
句柄指向同一个对象:==
和isequal
返回真正的
.
句柄指的是具有相同值的同一类的对象,但不是相同的对象(仅限)isequal
返回真正的
.
使用前面定义的NumHandle
类创建对象并复制句柄。
一个= NumHandle;b =一个;
使用==
和isequal
.
a = =
ans = 1
isequal (a, b)
ans = 1
的两个实例NumHandle
使用默认值初始化。
一个= NumHandle;b = NumHandle;
确定一个
和b
引用同一个对象。
a = =
ans = 0
确定一个
和b
有相同的价值。
isequal (a, b)
ans = 1
派生的处理
类使你的类能够:
继承几个有用的方法(处理类方法)
定义事件和监听器(事件和监听器语法)
定义动态属性(动态属性-向实例添加属性)
实现set和get方法(实现属性的Set/Get接口)
自定义复制行为(实现句柄类的复制)
看到处理的超类有关句柄类及其方法的更多信息。