在MATLAB的class方法中设置实例的类属性

时间:2017-09-20 20:54:21

标签: matlab oop

我的目标是:

使用MATLAB,在一个类方法中设置属性值,并且实例之间的属性值不同。

我的问题是:

  1. 在类方法中使用SET时,我将更改此类的所有实例的属性值,这不是我想要的。我只想更改此实例的属性值。

  2. 关于动态属性:我认为它用于创建实例的唯一属性,而不是设置常规类属性的唯一值,是吗?

  3. 代码示例:

    classdef Storage
    
        properties
          tree =  containers.Map('KeyType','int32', 'ValueType','any')
        end
    
        methods        
    
        function obj = set_tree(obj,period, value)
            obj.tree(period) = value;
        end
    
        end
    
    end
    

    使用此方法设置值时:

       st1 = Storage();
       st2 = Storage();
    
       st1 = st1.set_tree(10,1);
       st2 = st2.set_tree(10,2);
    

    现在,设置为st2.tree(10)的值将覆盖设置为st1.tree(10)的值,我试图避免这种情况。

1 个答案:

答案 0 :(得分:1)

您遇到的问题是将handle class对象设置为类属性的default valueThe relevant documentation说:

  

MATLAB®仅在加载类时评估属性默认值。每次创建该类的对象时,MATLAB都不会重新评估赋值。如果在类定义中将对象指定为默认属性值,则MATLAB在加载类时仅调用该对象的构造函数。

因此,对于上面的Storage类,所有实例将使用存储在tree属性中的相同默认containers.Map对象。由于containers.Map类是handle类的子类,因此它具有引用行为,这意味着对象的副本都将指向相同的底层键/值映射。如果您希望每个实例都有独立的对象,则可以在构造函数中初始化tree属性:

classdef Storage

  properties
    tree
  end

  methods
    function obj = Storage()
      obj.tree = containers.Map('KeyType','int32', 'ValueType','any');
    end
    function obj = set_tree(obj, value, period)
      obj.tree(period) = value;
    end
  end

end