我想在一个具有简单访问权限的类中拥有一个简单的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
成员,而不是第二级成员。
谢谢
答案 0 :(得分:1)
可以跟随the advice from the MathWorks related to static data,并且仍然创建行为,使其看起来像那些变量是成员。您可以通过重载subsref
和subsasgn
方法,如下所示。该代码使用静态方法来创建静态数据,因为它很简单,但是这种想法也可以使用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