Я хотел бы перегрузить только один тип вызовов subsref (тип '()) для определенного класса и оставить любые другие вызовы Matlab, встроенные в subsref, в частности, я хочу, чтобы Matlab обрабатывал доступ к свойствам/методам через '' тип. Но похоже, что встроенная функция Matlab не работает, когда subsref перегружен в классе.Почему я не могу использовать 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
Не уверен, что я полностью понимаю, но я думаю, что сначала вызывается встроенная функция, а затем в этом вызове вызывается метод перегрузки. Если возможно, установите точку останова в полезном месте. –
Что-то совсем другое: надеюсь, вы просто попытаетесь сделать это из личного интереса, так как для большинства проблем перегрузка подзаголовка не может быть лучшим решением. –
Я не уверен, что вы подразумеваете под встроенной функцией, которая вызывается первым - если это было гипотетически в случае (не уверен, как, но сказать), я думаю, мне нужно будет установить точку останова внутри встроенной функции subsref Matlab для проверки , Но это нативная функция, а не функция m, поэтому я не могу поставить точку останова. – Ben