我正在尝试在Matlab中使用可更新对象(类)和嵌套类。我观察到似乎是由于手柄状态引起的行为。
我写了两个类testA
和testB
。 testB
是将类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
的新计算值未存储在对象中)。
解决方案可能是考虑handle
的testA
类,并在完全初始化testB
对象之前强制将其删除。但是我不知道该怎么做。
这是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