我试图通过子类化 MATLABContainers.Map 类并添加具有 0 个输出的附加方法来扩展它,但在执行该方法时遇到“输出参数太多”错误。这并不是新方法实现所特有的——任何使用 0 输出扩展Containers.Map() 的其他方法都会生成此错误。
具体来说,执行时遇到错误,
obj = Containers();
obj.testfun();
对于以下类定义,
classdef Containers < handle & containers.Map
methods
% Test function to display keys.
function testfun(obj)
obj.keys(); % dumby thing to execute with incoming object.
disp('it works!');
end
end
end
然而,如果我们稍微修改它以输出至少一个参数,
classdef Containers < handle & containers.Map
methods
% Test function to display keys.
function dumby = testfun(obj)
obj.keys();
disp('it works!')
dumby = 1;
end
end
end
它将正确执行。该错误似乎特别发生在对container.Map 进行子类化时。如果重要的话,我正在使用 MATLAB R2014b。关于如何解决这个问题有什么建议吗?
不要尝试子类化containers.Map
。这只是我的意见,但 MathWorks 应该做到了Sealed
所以你就是做不到。
这里发生的事情是当你输入a.b
, or a(b)
or a{b}
,即转换为对该方法的调用subsref
。所有对象都有该方法。看doc subsref
有关 MATLAB 调用方式的更多详细信息subsref
但请注意 - 这相当复杂。
现在,如果您想自定义类的行为,您可以重载subsref
通过提供您自己的实现。containers.Map
这样做是因为它需要支持按键索引,这对于其他 MATLAB 类来说并不常见。
我无法准确地告诉你如何subsref
for containers.Map
已实现,因为它是一个内置类,所以我看不到代码。但我猜测,从你在这里看到的行为来看,它在某些时候试图弄清楚是否.testfun()
是对方法的调用testfun
,或财产testfun
,或一个字段testfun
,或者其他东西,它正在做的事情之一就是查看它是否被使用输出参数调用并相应地改变它的行为。
这是一个很好的例子,说明在不知道(并且可能修改)其内部结构的情况下,您实际上无法对对象进行子类化,这就是为什么我建议 MathWorks 最好这样做Sealed
阻止你尝试。无论如何,如果没有一些解决方法(即实现您自己的重载),您将无法使用您想要的行为对其进行子类化subsref
为您Containers
类以使其按照您想要的方式工作)和一些逆向工程(即事后猜测subsref
的方法containers.Map
).
相反,您可以尝试使用适配器模式,通过使用containers.Map
作为私有(可能是隐藏)属性,然后实现仅传递其参数并输出到底层的方法和属性containers.Map
。最后,也实现您自己的方法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)