如何在Matlab中作为顶级成员定义和访问静态属性?

时间:2018-09-11 09:15:11

标签: matlab class static static-members toplevel

我想在一个具有简单访问权限的类中拥有一个简单的static成员,即我希望拥有一个class_name.static_data而不是class_name.shared_obj.static_data

我已经搜索并找到了standard method of defining static members in Matlab classes, on mathwork.com as you can see below.

classdef SharedData < handle  % an auxiliary class to keep static data
    properties
        Data1
        Data2
    end
end

classdef UseData  % main class
    properties (Constant)
        Data = SharedData
    end
    % Class code here
end

然后我们可以将其与以下内容一起使用:

k = UseData
k.Data.Data1=5; % Want to be `k.Data1=5;` instead.

但是我希望有一个顶级static成员

(类似

obj_of_UseData.Data1=5;

obj_of_UseData.Data.Data1=5;

(即像顶级成员一样,而不是第二级成员)。我寻求一种方法来实现顶级static成员,而不是第二级成员。

谢谢

1 个答案:

答案 0 :(得分:1)

可以跟随the advice from the MathWorks related to static data,并且仍然创建行为,使其看起来像那些变量是成员。您可以通过重载subsrefsubsasgn方法,如下所示。该代码使用静态方法来创建静态数据,因为它很简单,但是这种想法也可以使用handle类转换为其他方法。

classdef UseData
   properties
      Data3
   end
   methods (Static)
      function out = setgetVar(name,value)
         persistent data;
         if isempty(data)
            data = struct('Data1',[],'Data2',[]);
         end
         if nargin==2
            data.(name) = value;
         end
         out = data.(name);
      end
   end
   methods
      function obj = subsref(obj,S)
         if isequal(S(1).type,'.')
            if strcmp(S(1).subs,'Data1') || strcmp(S(1).subs,'Data2')
               obj = UseData.setgetVar(S(1).subs);
               return
            end
         end
         obj = builtin('subsref',obj,S);
      end
      function obj = subsasgn(obj,S,value)
         if isequal(S(1).type,'.')
            if strcmp(S(1).subs,'Data1') || strcmp(S(1).subs,'Data2')
               UseData.setgetVar(S(1).subs,value);
               return
            end
         end
         obj = builtin('subsasgn',obj,S,value);
      end
   end
end

要查看其工作原理,

>> x = UseData;
>> y = UseData;
>> x.Data1 = 'bla';
>> y.Data2 = [5,6];
>> x.Data3 = 0;
>> y.Data3 = 10;
>> y.Data1
ans = bla
>> x.Data2
ans =
   5   6
>> x.Data3
ans = 0
>> y.Data3
ans =  10