Как определить и получить доступ к статическим свойствам в качестве члена верхнего уровня в Matlab? - PullRequest
0 голосов
/ 11 сентября 2018

Я хочу иметь простой static член в классе с простым доступом, т.е. мне нравится иметь class_name.static_data вместо class_name.shared_obj.static_data.

Я искал и нашел стандартный метод определения статических членов в Matlab классах на mathwork.com, как вы можете видеть ниже.

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 голосов
/ 11 сентября 2018

Можно следовать совету MathWorks, касающемуся статических данных , и при этом создавать поведение, при котором создается впечатление, что эти переменные являются членами. Вы можете сделать это, перегрузив методы 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
...