问题描述
我正在尝试使用可变数量的子类 Resset 构造类的对象,这些子类Resset存储为 Analysis 属性 resets 中的结构(请参见下面的 Matlab 代码)。classdef Analysis有一个名为addResset的方法,该方法构造了一个新的 Resset 实例并将该实例设置为属性ressets。但是,当我创建类 Analysis 的实例(假设为 A)并使用 A.addResset 添加 Resset 对象时,该方法不会自动更新实例 A 中的属性 resset:
>> A = Analysis('some_name');
>> A.addResset('some_res');
>> A
A =
Properties:
name: 'some_name'
ressets: []
stepTypes: []
Methods
Analysis addResset
相反,我必须写:
>> A = A.addResset('some_res')
Properties:
name: 'some_name'
ressets: [1x1 struct]
stepTypes: []
为什么当我用它的方法调用A时,Matlab 不更新实例A?只要Analysis 类是' flat ',这不是什么大问题。但是,在我的(实际)情况下,每个 Reset 类也将具有 Data 类(即另一个嵌套级别)。目前,我生成了一个空的Analysis 实例,添加了一些Resset 类,将Data 类添加到每个单独的Resset 类,然后我必须将每个父对象更新到顶层(即Analysis)。它使我的脚本变得过长和凌乱。
我对 Matlab 的面向对象编程部分比较陌生。我在 addResset 方法的定义中做错了吗?在 python 中,当在方法中引用时,实例似乎会自动更新,我希望 Matlab 具有类似的功能?
Matlab代码
Matlab 版本:7.13.0.564(R2011b 32bits)
classdef Analysis
properties
name
ressets %structure of Resset objects
stepTypes
end
methods
function obj = Analysis(name)
% ANALYSIS contructs an analysis object
if nargin > 0
obj.name = name;
end
end
end
methods
function [obj resset valid_fieldname] = addResset(obj,name)
%create a new Resset class instance(PackageName.ClassName)
resset = xrf_read.Resset(name);
%replace 'possible' dots in name (=invalid fieldname)
valid_fieldname = regexprep(name,'\.','_');
%add Resset instance to ressets property
obj.ressets.(valid_fieldname) = resset;
end
end
end
为了简单起见,Reset 类看起来像
classdef Resset
properties
name
datas
end
methods
function obj = Resset(name)
% RESSET constructs a resset object
if nargin > 0
obj.name = name;
end
end
end
end