是否有可能获得Copyable
子类的句柄而不是获得副本?
我有一个想要拥有Copyable
的类层次结构。
classdef A < matlab.mixins.Copyable
properties
stuff;
end
methods
function action(self)
% ...
end
end
end
各种子类提供了主要行为的变体,并且特定的子类可汇总这些行为中的一些以供后续应用
classdef multiA < classA
properties
nElements = 1;
elements;
iElement = 0;
currentElement;
end
methods
function self = multiA()
end
function addElement(self, fhdl)
if self.nElements == 0
self.nElements = 1;
self.elements = {fhdl}; % Store handles to constructors
else
self.nElements = self.nElements + 1;
self.elements(self.nElements) = fhdl; % Store handles to constructors
end
end
function nextElement(self)
if self.iElement < self.nElements
self.iElement = self.iElement + 1;
fhdl = self.elements(self.iElement);
self.element = fhdl(); % instantiate with constructors
end
end
function action(self)
if self.iElement > 0 && self.iElement <= self.nElements
self.currentElement.action(); % Pass use request to constructed objects
end
end
end
end
期望用户使用addElement
构建对象,并使用nextElement
遍历列表,并通过`action调用所包含对象的行为。
multi = multiA();
multi.addElement( @OneSubClass );
multi.addElement( @AnotherSubClass );
multi.addElement( @ThirdSubClass );
% ...
multi.nextElement();
multi.action();
multiA
类通过了一些基本的单元测试,我开始尝试应用它。它似乎正在工作。然后我发现一种情况,multi.action()
似乎在两种行为之间来回摇摆。
这似乎不太可能,但是可以想象,在我移至OneSubClass
之后,AnotherSubClass
类型的对象仍然存在。
编写一个单元测试,该单元测试将在实例化每个元素时捕获其句柄,并检查在实例化下一个元素之前,该元素是否仍在使用中。像这样:
multiA.nextElement();
ehdl = multiA.currentElement;
% do things
testCase.veriftySameHandle(multiA.currentElement,ehdl);
A ehdl
似乎是存储元素的副本,而不是它的句柄,即使我没有显式调用copy()
也是如此。 (我这样说是因为ehdl
在nextElement()
时保留了所包含对象的状态,而对currentElement
的新鲜访问显示了预期的变化。)
是否有一种方法可以强制保留从matlab.mixins.Copyable
派生的对象的句柄?