动态属性 - 向实例添加属性
什么是动态属性
您可以将属性添加到从 dynamicprops
类派生的类的实例中。这些动态属性有时称为实例属性。您可以使用动态属性将临时数据附加到对象,或用它指定要与某个类实例(而非该类的所有对象)相关联的数据。
多个程序可以对同一个对象定义动态属性。在这些情况下,请避免名称冲突。动态属性名称必须为有效的 MATLAB® 标识符(请参阅变量名称),并且不能与类的方法同名。
动态属性的特征
一旦定义,动态属性的行为就与类定义的属性相似:
使用圆点表示法设置和查询动态属性的值。(请参阅将数据赋给动态属性。)
MATLAB 在您保存和加载动态属性所附加到的对象时保存和加载这些动态属性。(请参阅Dynamic Properties and ConstructOnLoad。)
定义动态属性的特性。(请参阅设置动态属性特性。)
默认情况下,动态属性将其
NonCopyable
特性设置为true
。如果复制包含动态属性的对象,则不会复制动态属性。(请参阅Objects with Dynamic Properties。)添加属性 set 和 get 访问方法。(请参阅Set and Get Methods for Dynamic Properties。)
侦听动态属性事件。(请参阅Dynamic Property Events。)
使用受限语法从对象数组访问动态属性值。(请参阅Accessing Properties and Methods in Object Arrays。)
在比较具有动态属性的对象时,即使属性具有相同的名称和值,
isequal
函数也始终返回false
。要比较包含动态属性的对象,请为您的类重载isequal
。
定义动态属性
作为 dynamicprops
类(它本身也是 handle
类的子类)的子类的任何类都可以使用 addprop
方法定义动态属性。语法为:
P = addprop(H,'PropertyName')
其中:
P
是 matlab.metadata.DynamicProperty
对象数组
H
是句柄数组
PropertyName
是您要添加到每个对象的动态属性的名称
命名动态属性
在命名动态属性时,请仅使用有效的名称(请参阅变量名称)。此外,不要使用以下名称:
与类方法的名称相同的名称
与类事件的名称相同的名称
包含句点 (
.
) 的名称支持数组功能的函数的名称:
empty
、transpose
、ctranspose
、permute
、reshape
、display
、disp
、details
或sort
。
设置动态属性特性
要设置属性特性,请使用与动态属性关联的 matlab.metadata.DynamicProperty
对象。例如,如果 P
是 addprop
返回的对象,则以下语句会将该属性的 Hidden
特性设置为 true
:
P.Hidden = true;
属性特性 Constant
和 Abstract
对动态属性没有任何意义。将这些属性的值设置为 true
将不起作用。
删除动态属性
通过删除动态属性的 matlab.metadata.DynamicProperty
对象来删除动态属性:
delete(P);
将数据赋给动态属性
假设您正在使用一组预定义的用户界面小组件类(按钮、滑块、复选框等)。您要存储小组件类的每个实例的位置。假设小组件类不是为存储特定布局方案的位置数据而设计的。您不想创建映射或哈希表来单独维护这些信息。
假设 button
类是 dynamicprops
的子类,通过添加动态属性来存储布局数据。以下是一个用于创建 uicontrol
按钮的简单类:
classdef button < dynamicprops properties UiHandle end methods function obj = button(pos) if nargin > 0 if length(pos) == 4 obj.UiHandle = uicontrol('Position',pos,... 'Style','pushbutton'); else error('Improper position') end end end end end
创建 button
类的实例,添加动态属性,并设置其值:
b1 = button([20 40 80 20]);
b1.addprop('myCoord');
b1.myCoord = [2,3];
像访问任何其他属性一样访问动态属性,但只需访问您定义的对象即可:
b1.myCoord
ans = 2 3
动态属性的 Access 特性
不推荐对动态属性使用非公共 Access 特性,因为这些属性大多属于在类方法之外创建的特定实例。动态属性的 Access 特性应用于包含该动态属性的实例所在的类。动态属性 Access 特性不一定应用于添加动态属性时所用方法所属的类。
例如,如果一个基类方法添加了一个对某实例具有私有访问权限的动态属性,则私有访问权限将仅应用于该实例所在的类。
有关动态属性特性的详细信息,请参阅 matlab.metadata.DynamicProperty
。使用句柄 findprop
方法获取 matlab.metadata.DynamicProperty
对象。
列出对象动态属性
您可以使用句柄 findprop
方法来列出对象的动态属性。步骤如下:
使用
properties
函数获取对象属性的名称。使用
findprop
方法获取每个属性的元数据对象。使用
isa
函数确定元数据对象是否为matlab.metadata.DynamicProperty
对象。如果是,则该属性为动态属性。
getDynamicPropNames
函数展示了如何显示为输入 obj
定义的任何动态属性的名称。
function getDynamicPropNames(obj) % Find dynamic properties allprops = properties(obj); for i=1:numel(allprops) m = findprop(obj,allprops{i}); if isa(m,'matlab.metadata.DynamicProperty') disp(m.Name) end end end