代码之家  ›  专栏  ›  技术社区  ›  Seyfi

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

  •  0
  • Seyfi  · 技术社区  · 6 年前

    我想要一个简单的 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.
    

    但我希望有一个顶级的 静止的 成员

    (有点像

    obj_of_UseData.Data1=5;

    不是

    obj_of_UseData.Data.Data1=5; )

    (例如,像一个顶级成员,而不是二级成员)。我寻求一种实现顶层的方法 静止的 成员,不是二级成员。

    谢谢

    1 回复  |  直到 6 年前
        1
  •  1
  •   Cris Luengo    6 年前

    可以跟随 the advice from the MathWorks related to static data ,并且仍然创建使这些变量看起来像成员的行为。您可以通过重载 subsref subsasgn 方法如下。这些代码使用静态方法来创建静态数据,因为它是最简单的,但是这个想法也转换为使用句柄类的另一个方法。

    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
    
    推荐文章