我试图在 Matlab 中使用可更新的对象(类)和嵌套类。我观察到一种似乎是由于句柄状态引起的行为。
我写了2个类testA
and 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
in 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
目的。但是我不知道该怎么做。
This is 记录的行为 https://www.mathworks.com/help/matlab/matlab_oop/specifying-properties.html#brqy3km-10: 在你的testB
定义,obj=testA
仅在加载类定义时评估一次。该类的所有实例都将具有对同一句柄类对象的引用。
Just 位于同一文档页面下方 https://www.mathworks.com/help/matlab/matlab_oop/specifying-properties.html#br18hyr你会发现你应该创建一个新实例testA
在构造函数中testB
,如果你想要一个不同的实例testA
对于每个实例testB
:
classdef testB
properties
objA
end
methods
function obj=testB()
objA = testA;
% ... further initialization
end
end
end
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)