带或不带句柄的嵌套 classdef?
Nested classdef with or without handle?
我正在尝试在带有嵌套 class 的 Matlab 中使用可更新对象 (class)。我观察到似乎是由于句柄状态引起的行为。
我写了 2 classes testA
和 testB
。 testB
是主要的 class 调用 class 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
是句柄class。
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
我观察到 testA
中的 val
属性 没有重新初始化(testA
中的 val
保持以前的值)。我不确定,但这似乎是由于 handle
功能。方法 tt.up
增加 val
属性 in testA
符合预期。
其次,如果我将 testA
class 更改为值 class。
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
class testA
并在完全初始化 testB
对象之前强制删除它。但是我不知道该怎么做。
这是 documented behavior:在您的 testB
定义中,obj=testA
仅在加载 class 定义时计算一次。 class 的所有实例都将引用同一个句柄 class 对象。
只是 below on same documentation page 你会看到你应该在 testB
的构造函数中创建一个 testA
的新实例,如果你想要一个不同的 testA
实例对于 testB
的每个实例:
classdef testB
properties
objA
end
methods
function obj=testB()
objA = testA;
% ... further initialization
end
end
end
我正在尝试在带有嵌套 class 的 Matlab 中使用可更新对象 (class)。我观察到似乎是由于句柄状态引起的行为。
我写了 2 classes testA
和 testB
。 testB
是主要的 class 调用 class 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
是句柄class。
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
我观察到 testA
中的 val
属性 没有重新初始化(testA
中的 val
保持以前的值)。我不确定,但这似乎是由于 handle
功能。方法 tt.up
增加 val
属性 in testA
符合预期。
其次,如果我将 testA
class 更改为值 class。
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
class testA
并在完全初始化 testB
对象之前强制删除它。但是我不知道该怎么做。
这是 documented behavior:在您的 testB
定义中,obj=testA
仅在加载 class 定义时计算一次。 class 的所有实例都将引用同一个句柄 class 对象。
只是 below on same documentation page 你会看到你应该在 testB
的构造函数中创建一个 testA
的新实例,如果你想要一个不同的 testA
实例对于 testB
的每个实例:
classdef testB
properties
objA
end
methods
function obj=testB()
objA = testA;
% ... further initialization
end
end
end