我正在尝试构建类分析的对象,其中可变数量的子类 Resset 存储为Analysis属性 ressets中的结构(参见下面的Matlab代码)。 classdef 分析有一个名为 addResset 的方法,用于构建 Resset 的新实例,并将此实例设置为属性 ressets 。但是,当我创建一个实例时,让我们说一个Analysis类,我使用A.addResset添加一个Resset对象,该方法不会自动更新实例A中的属性ressets:
>> 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 ',这不是一个大问题。但是,在我的(实际)情况下,每个Resset类也将具有Data类(即另一个嵌套级别)。目前,我生成一个空的Analysis实例,添加一些Resset类,向每个单独的Resset类添加Data类,然后我必须将每个父对象更新到顶层(即Analysis)。它使我的剧本过长而且凌乱。
我对Matlab的面向对象编程部分比较陌生。我在addResset方法的定义中做错了什么?在python中,一个实例似乎在方法中引用时会自动更新,我希望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
为简单起见,Resset类看起来像
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
答案 0 :(得分:3)
简短:使你的类成为句柄的子类。
这些旧样式类遵循“写入时复制”原则,这意味着它们不会更改原始实例。