特定のクラスの subsref 呼び出しの 1 つのタイプ (「()」タイプ) のみをオーバーロードし、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