带有或不带有句柄的嵌套classdef?

问题描述 投票:2回答:1

我正在尝试在Matlab中使用可更新对象(类)和嵌套类。我观察到似乎是由于手柄状态引起的行为。

我写了两个类testAtestBtestB是将类testA作为属性调用的主要类:

classdef testB 
    properties
        objA=testA;
    end
    methods
        function obj=testB()
            obj.objA
            if isempty(obj.objA.val)
                obj.objA.val=5;
            else
                 obj.objA.val=obj.objA.val+5;
            end
        end
        function up(obj)
            obj.objA.val=obj.objA.val+6;
            obj.objA.val
        end
    end
end

首先,testA是一个句柄类。

classdef testA < handle 
    properties
        val=[];
    end
    methods
        function obj=testA()
        end
        function set.val(obj,tt)
            obj.val=tt;
        end
    end
end

当我两次创建testB对象时

tt=testB
tt=testB

[我注意到val中的testA属性未重新初始化(val中的testA保留先前的值)。我不确定,但这似乎是由于handle功能所致。方法tt.up按预期增加val中的testA属性。

第二,如果我将testA类更改为值类。

classdef testA  
    properties
        val=[];
    end
    methods
        function obj=testA()
        end
        function obj=set.val(obj,tt)
            obj.val=tt;
        end
    end
end

在这种情况下,每次使用新的tt=testB实例创建新的testB实例时,都会连续调用testA。不幸的是,在这种情况下,up方法无法按预期方式工作(val的新计算值未存储在对象中)。

解决方案可能是考虑handletestA类,并在完全初始化testB对象之前强制将其删除。但是我不知道该怎么做。

matlab class handle
1个回答
0
投票

这是documented behavior:在您的testB定义中,当加载类定义时,obj=testA仅被评估一次。该类的所有实例都将引用相同的句柄类对象。

below on same documentation page,您会看到您应该在testA的构造函数中创建testB的新实例,如果您想要为testA的每个实例使用不同的testB实例:

classdef testB 
    properties
        objA
    end
    methods
        function obj=testB()
            objA = testA;
            % ... further initialization
        end
    end
end
© www.soinside.com 2019 - 2024. All rights reserved.