我想为特定类仅重载一种类型的 subsref 调用('()' 类型),并将任何其他调用留给 Matlab 的内置 subsref - 具体来说,我希望 Matlab 通过 '. ' 类型。但是,当 subsref 在类中重载时,Matlab 的“内置”函数似乎不起作用。
考虑这个类:
classdef TestBuiltIn
properties
testprop = 'This is the built in method';
end
methods
function v = subsref(this, s)
disp('This is the overloaded method');
end
end
end
要使用重载的 subsref 方法,我这样做:
t = TestBuiltIn;
t.testprop
>> This is the overloaded method
正如预期的那样。但现在我想调用 Matlab 内置的 subsref 方法。为了确保我做的事情正确,首先我尝试对结构进行类似的调用:
x.testprop = 'Accessed correctly';
s.type = '.';
s.subs = 'testprop';
builtin('subsref', x, s)
>> Accessed correctly
这也是意料之中的。但是,当我在 TestBuiltIn 上尝试相同的方法时:
builtin('subsref', t, s)
>> This is the overloaded method
...Matlab 调用重载方法而不是内置方法。当我要求它调用内置方法时,为什么Matlab会调用重载方法?
更新:响应@Andrew Janke 的回答,该解决方案几乎可以工作,但并不完全。考虑这个类:
classdef TestIndexing
properties
prop1
child
end
methods
function this = TestIndexing(n)
if nargin==0
n = 1;
end
this.prop1 = n;
if n<2
this.child = TestIndexing(n+1);
else
this.child = ['child on instance ' num2str(n)];
end
end
function v = subsref(this, s)
if strcmp(s(1).type, '()')
v = 'overloaded method';
else
v = builtin('subsref', this, s);
end
end
end
end
所有这些都有效:
t = TestIndexing;
t(1)
>> overloaded method
t.prop1
>> 1
t.child
>> [TestIndexing instance]
t.child.prop1
>> 2
但这不起作用;它为孩子使用内置的 subsref 而不是重载的 subsref:
t.child(1)
>> [TestIndexing instance]
请注意,上述行为与这两种行为都不一致(正如预期的那样):
tc = t.child;
tc(1)
>> overloaded method
x.child = t.child;
x.child(1)
>> overloaded method