使用matlab.mixins.Copyable

时间:2018-09-05 15:51:16

标签: matlab oop handle

短版

是否有可能获得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()也是如此。 (我这样说是因为ehdlnextElement()时保留了所包含对象的状态,而对currentElement的新鲜访问显示了预期的变化。)

是否有一种方法可以强制保留从matlab.mixins.Copyable派生的对象的句柄?

0 个答案:

没有答案