Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
matlab.mixins.Copyable在分配时是否自动复制 短版_Matlab_Oop_Handle - Fatal编程技术网

matlab.mixins.Copyable在分配时是否自动复制 短版

matlab.mixins.Copyable在分配时是否自动复制 短版,matlab,oop,handle,Matlab,Oop,Handle,是否有可能获得Copyable子类的句柄而不是副本 上下文 我有一个类层次结构,我希望它是可复制的 classdef A < matlab.mixins.Copyable properties stuff; end methods function action(self) % ... end end end 问题出现了 multiA类通过了一些基本的单元测试,我开始尝试应用它。它

是否有可能获得
Copyable
子类的句柄而不是副本


上下文 我有一个类层次结构,我希望它是可复制的

classdef A < matlab.mixins.Copyable
    properties
        stuff;
    end

    methods
        function action(self)
            % ...
        end
    end
end
问题出现了
multiA
类通过了一些基本的单元测试,我开始尝试应用它。它似乎在起作用。然后我遇到了一种情况,
multi.action()
似乎在两种行为之间不可预测地来回翻转

这似乎不太可能,但可以想象的是,在我转到另一个子类之后,
OneSubClass
类型的对象仍然存在

(错误的?)解决方案 编写一个单元测试,在实例化时捕获每个元素的句柄,并检查在实例化下一个元素之前该句柄是否仍在使用。比如:

multiA.nextElement();
ehdl = multiA.currentElement;
% do things
testCase.veriftySameHandle(multiA.currentElement,ehdl);
ehdl
似乎是存储元素的副本,而不是它的句柄,即使我没有显式调用
copy()
。(我这样说是因为
ehdl
保留了
nextElement()时所包含对象的状态,而
currentElement
的新访问显示了预期的更改。)


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

下一个元素
nextElement
中的第三行应该是这样的?:
self.currentElement=self.elements{self.iElement}()是。当然我发现分成两部分比较容易理解,但这就是要点。上面显示的代码就是您正在使用的实际代码。我可以看到一些错误,这些错误似乎使上面的代码无法实际运行。不,这是我在这里键入的摘要。直到最近,matlab还不是我在这方面有很多经验的语言,所以我仍在培养观察其正确性或不足的能力。既然您提到了它,我可以看出我至少遗漏了5(1)个
self实例。
@dmckee告诉您“在比较句柄对象时,使用
=
测试对象是否具有相同的句柄。使用
isequal
确定具有不同句柄的对象是否具有相同的属性值。”?
multi = multiA();
multi.addElement( @OneSubClass );
multi.addElement( @AnotherSubClass );
multi.addElement( @ThirdSubClass );
% ...
multi.nextElement();
multi.action();
multiA.nextElement();
ehdl = multiA.currentElement;
% do things
testCase.veriftySameHandle(multiA.currentElement,ehdl);