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

How to define and access to static properties as a top-level member in Matlab?

我想在具有简单访问权限的 class 中有一个简单的 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 成员,而不是二级成员。

谢谢

可以遵循 the advice from the MathWorks related to static data,并仍然创建使这些变量看起来像是成员的行为。您可以通过重载 subsrefsubsasgn 方法来实现,如下所示。此代码使用创建静态数据的静态方法方式,因为它最简单,但思想转化为另一种方法,也使用句柄 class。

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