2

问题描述

我正在尝试使用可变数量的子类 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
4

1 回答 1

3

简而言之:使您的类成为句柄的子类。

这些旧样式类遵循“写入时复制”原则,这意味着它们不会更改原始实例。

于 2013-05-17T12:12:13.527 回答