我想只爲一個特定的類重載一種subsref調用('()'類型),並留下任何其他調用Matlab的內置子參考 - 具體來說,我希望Matlab通過處理屬性/方法訪問''類型。但是,當subsref在類中被重載時,似乎Matlab的'builtin'函數不起作用。爲什麼我不能使用內建函數來重載subsref?
考慮這個類:
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
不知道我是否完全理解,但我認爲首先調用內置函數,然後在該調用中調用重載方法。如果可能的話,在有用點放置一個斷點。 – 2013-04-24 18:40:17
完全不同的東西:我希望你只是爲了個人興趣去嘗試這樣做,因爲對於大多數問題,重載subsref可能不是最好的解決方案。 – 2013-04-24 18:41:39
我不確定你首先調用的內建函數是什麼意思 - 如果這是假設的情況(不知道如何,但說),我想我需要在Matlab的內置subsref函數內設置一個斷點來驗證。但是,這是一個本地函數,而不是一個m函數,所以我不能在那裏放置一個斷點。 – Ben 2013-04-24 19:26:07