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

问题描述 投票:0回答:1

我希望在一个简单访问的类中有一个简单的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成员,而不是二级成员。

谢谢

matlab class static static-members toplevel
1个回答
1
投票

有可能遵循the advice from the MathWorks related to static data,仍然创建行为,使它看起来像那些变量是成员。您可以通过重载下面的subsrefsubsasgn方法来实现。这段代码使用静态方法创建静态数据,因为它最简单,但是这个想法也转换为另一种方法,使用句柄类。

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
© www.soinside.com 2019 - 2024. All rights reserved.