Ich möchte nur eine Art von Subsref-Aufrufe (der '()' Typ) für eine bestimmte Klasse überladen und lassen Sie alle anderen Aufrufe Matlab eingebaute subsref - speziell möchte ich Matlab mit Eigentum/Methoden-Zugriff über die "." Art. Aber es scheint, als ob Matlabs "eingebaute" Funktion nicht funktioniert, wenn subsref in einer Klasse überladen wird.Warum kann ich builtin nicht für Klassen verwenden, die subsref überladen?
Betrachten Sie diese Klasse:
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
die überladene subsref Methode zu verwenden, kann ich dies tun:
t = TestBuiltIn;
t.testprop
>> This is the overloaded method
, die als erwartet ist. Aber jetzt möchte ich die eingebaute Subref-Methode von Matlab aufrufen. Um sicherzustellen, dass ich die Dinge richtig mache, probiere ich zuerst einen ähnlichen Aufruf an einer Struktur aus:
Das ist wie erwartet. Aber, wenn ich die gleiche Methode auf TestBuiltIn versuchen:
builtin('subsref', t, s)
>> This is the overloaded method
... Matlab ruft die überladene Methode anstelle der in Verfahren gebaut. Warum ruft Matlab die überladene Methode auf, wenn ich anforderte, dass sie die eingebaute Methode aufruft?
UPDATE: Als Antwort auf @Andrew Janke Antwort, diese Lösung funktioniert fast, aber nicht ganz. Betrachten Sie diese Klasse:
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
All dies funktioniert:
t = TestIndexing;
t(1)
>> overloaded method
t.prop1
>> 1
t.child
>> [TestIndexing instance]
t.child.prop1
>> 2
Aber das funktioniert nicht; Es nutzt die für das Kind in subsref gebaut und nicht überlasteten subsref:
t.child(1)
>> [TestIndexing instance]
Beachten Sie, dass das oben beschriebene Verhalten mit diesen beiden Verhaltensweisen unvereinbar ist (die wie erwartet):
tc = t.child;
tc(1)
>> overloaded method
x.child = t.child;
x.child(1)
>> overloaded method
Nicht sicher, ob ich vollständig verstehe, aber ich denke, dass zuerst die eingebaute Funktion aufgerufen wird, und dann in diesem Aufruf die Überlademethode aufgerufen wird. Wenn möglich, setzen Sie einen Haltepunkt an einer nützlichen Stelle. –
Etwas völlig anderes: Ich hoffe, du versuchst dies nur aus persönlichem Interesse zu tun, da die meisten Probleme beim Überladen von subsref nicht die beste Lösung sind. –
Ich bin mir nicht sicher, was Sie meinen, wenn die eingebaute Funktion zuerst aufgerufen wird - wenn das hypothetisch der Fall wäre (nicht sicher, wie, aber sagen), würde ich einen Breakpoint in Matlabs eingebauter Subsref-Funktion setzen müssen, um dies zu verifizieren . Aber das ist eine native Funktion und keine m-Funktion, deshalb kann ich dort keinen Haltepunkt setzen. – Ben