Main Content

动态属性 - 向实例添加属性

什么是动态属性

您可以将属性添加到从 dynamicprops 类派生的类的实例中。这些动态属性有时称为实例属性。您可以使用动态属性将临时数据附加到对象,或用它指定要与某个类实例(而非该类的所有对象)相关联的数据。

多个程序可以对同一个对象定义动态属性。在这些情况下,请避免名称冲突。动态属性名称必须为有效的 MATLAB® 标识符(请参阅变量名称),并且不能与类的方法同名。

动态属性的特征

一旦定义,动态属性的行为就与类定义的属性相似:

定义动态属性

作为 dynamicprops 类(它本身也是 handle 类的子类)的子类的任何类都可以使用 addprop 方法定义动态属性。语法为:

P = addprop(H,'PropertyName')

其中:

Pmatlab.metadata.DynamicProperty 对象数组

H 是句柄数组

PropertyName 是您要添加到每个对象的动态属性的名称

命名动态属性

在命名动态属性时,请仅使用有效的名称(请参阅变量名称)。此外,不要使用以下名称:

  • 与类方法的名称相同的名称

  • 与类事件的名称相同的名称

  • 包含句点 (.) 的名称

  • 支持数组功能的函数的名称:emptytransposectransposepermutereshapedisplaydispdetailssort

设置动态属性特性

要设置属性特性,请使用与动态属性关联的 matlab.metadata.DynamicProperty 对象。例如,如果 Paddprop 返回的对象,则以下语句会将该属性的 Hidden 特性设置为 true

P.Hidden = true;

属性特性 ConstantAbstract 对动态属性没有任何意义。将这些属性的值设置为 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 方法来列出对象的动态属性。步骤如下:

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

相关主题