Vorrei sovraccaricare solo un tipo di chiamate subsref (il tipo '()' per una particolare classe e lasciare qualsiasi altra chiamata al sottosistema incorporato di Matlab - in particolare, voglio che Matlab gestisca l'accesso di proprietà/metodo tramite il '' genere. Ma sembra che la funzione 'builtin' di Matlab non funzioni quando subsref è sovraccarico in una classe.Perché non posso usare builtin per le classi che sovraccaricano il sottorequ?
Considerate questa classe:
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
di utilizzare il metodo di overload subsref, faccio questo:
t = TestBuiltIn;
t.testprop
>> This is the overloaded method
Ecco come previsto. Ma ora voglio chiamare il metodo sottosf costruito da Matlab. Per assicurarsi che sto facendo le cose per bene, prima cerco un bando simile su una struttura:
x.testprop = 'Accessed correctly';
s.type = '.';
s.subs = 'testprop';
builtin('subsref', x, s)
>> Accessed correctly
Ecco come previsto pure. Ma, quando provo lo stesso metodo su TestBuiltIn:
builtin('subsref', t, s)
>> This is the overloaded method
... Matlab chiama il metodo di overload, piuttosto che il costruito nel metodo. Perché Matlab chiama il metodo sovraccarico quando ho richiesto che chiami il metodo integrato nel?
AGGIORNAMENTO: In risposta alla risposta di @Andrew Janke, questa soluzione quasi funziona ma non del tutto. Considerate questa classe:
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
Tutto questo funziona:
t = TestIndexing;
t(1)
>> overloaded method
t.prop1
>> 1
t.child
>> [TestIndexing instance]
t.child.prop1
>> 2
Ma questo non funziona; Esso utilizza il costruito nel subsref per il bambino piuttosto che il subsref sovraccarico:
t.child(1)
>> [TestIndexing instance]
Nota che il comportamento di cui sopra non è coerente con entrambi questi comportamenti (che sono come previsto):
tc = t.child;
tc(1)
>> overloaded method
x.child = t.child;
x.child(1)
>> overloaded method
Non sono sicuro di aver capito completamente, ma penso che prima venga chiamata la funzione integrata, e in quella chiamata viene chiamato il metodo di sovraccarico. Se possibile, inserire un punto di interruzione in un punto utile. –
Qualcosa di completamente diverso: spero che tu provi a farlo per interesse personale, poiché per la maggior parte dei problemi l'overload di subsref potrebbe non essere la soluzione migliore. –
Non sono sicuro di cosa intendi con la funzione incorporata chiamata per prima; se ciò fosse ipotetico (non so come, ma diciamo), penso che avrei bisogno di impostare un punto di interruzione all'interno della funzione subsref incorporata da Matlab per verificare . Ma questa è una funzione nativa piuttosto che una funzione m, quindi non posso mettere lì un breakpoint. – Ben