我是否可以创建对句柄对象的引用,以便我可以在一个点上替换对象本身,并且引用将被更新?
示例:
classdef IShifter < handle
methods (Abstract)
x = Shift(this, x);
end
end
classdef Shifter1 < IShifter
methods
function x = Shift(this, x)
x = circshift(x, 1);
end
end
end
classdef Shifter2 < IShifter
methods
function x = Shift(this, x)
x = [ 0 ; x ];
end
end
end
classdef Item
properties (Access = 'private')
shifter; % should be a pointer/reference to the object which is in the respective parent container object
end
methods
function this = Item(shifter)
this.shifter = shifter;
end
function x = test(this, x)
x = this.shifter.Shift(x);
end
end
end
% note this is a value class, NOT a handle class!
classdef ItemContainer
properties
shifter;
items;
end
methods
function this = ItemContainer()
this.shifter = Shifter1;
this.items{1} = Item(this.shifter);
this.items{2} = Item(this.shifter);
end
function Test(this)
this.items{1}.Test( [ 1 2 3] )
this.items{2}.Test( [ 1 2 3] )
end
end
end
然后,输出应为:
items = ItemContainer();
items.Test();
[ 3 1 2 ]
[ 3 1 2 ]
items.shifter = Shifter2;
items.Test();
[ 0 1 2 ]
[ 0 1 2 ]
但它是:
items = ItemContainer();
items.Test();
[ 3 1 2 ]
[ 3 1 2 ]
items.shifter = Shifter2;
items.Test();
[ 3 1 2 ]
[ 3 1 2 ]
因为将新的Shifter对象分配给父对象项不会更新容器中的引用。
我正在寻找像C这样的东西,其中所有“移位器”属性都是指针,我可以把我想要的任何Shifter对象放到这个“地址”中。
ItemContainer和Item不是句柄类。 我想避免使用事件来更新引用或实现set方法来更新引用
答案 0 :(得分:0)
Matlab中的pass-by-reference概念到目前为止(并且大多数仅限于handle
- 类)。它并没有像你想要的那样远。
如果您不想使用set方法,可以使用返回items
{this.shifter,this.shifter}
作为依赖属性
根据您的评论,items
比单元格数组复杂一点。因此,您可能希望使用属性itemsStore
(或itemsCache
或您喜欢的任何名称来临时存储items
)以及依赖属性{{1 }}。 items
的get方法检查items
是否为空;如果是,则重建项目数组并将其存储在itemsStore
中,否则,它只返回itemsStore
的内容。此外,您需要向itemStore
添加一个清空shifter
的set方法,以便需要重新创建itemsStore
。请注意,MLint会向您发出警告,指出属性的set方法不应写入另一个属性。此警告旨在告诉您,当您保存对象然后再从磁盘加载它时,将执行所有设置的方法。根据执行顺序,设置写入其他属性的方法可能会产生意外结果。在您的情况下,它没有问题,因为清空items
是您的代码旨在处理的东西。如果需要,可以右键单击MLint警告,禁用该行。
答案 1 :(得分:0)
不幸的是我不认为这在Matlab中是可行的。
但是,您可以使用set方法或subsasgn
在import play.api.inject.Injector
import javax.inject.Inject
class SomeClassRequiringInjector @Inject() (injector: Injector) { ... }
定义时重新定义items{1}
和items{2}
的内容。然后,您将能够获得您所要求的行为。
最佳,