Tôi muốn quá tải chỉ có một loại cuộc gọi subsref (loại '()' cho một lớp cụ thể và để lại bất kỳ cuộc gọi nào khác để xây dựng trong subsref của Matlab - cụ thể, tôi muốn Matlab xử lý truy cập thuộc tính/phương thức thông qua '.' kiểu. Nhưng, có vẻ như chức năng 'builtin' của Matlab không hoạt động khi subsref bị quá tải trong một lớp.Tại sao tôi không thể sử dụng nội trang cho các lớp quá tải subref?
xem xét lớp này:
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
Để sử dụng phương pháp subsref quá tải, tôi làm điều này:
t = TestBuiltIn;
t.testprop
>> This is the overloaded method
Đó là như mong đợi. Nhưng bây giờ tôi muốn gọi Matlab được xây dựng trong phương pháp subsref. Để đảm bảo tôi đang làm đúng, trước tiên, tôi thử một cuộc gọi tương tự trên cấu trúc:
x.testprop = 'Accessed correctly';
s.type = '.';
s.subs = 'testprop';
builtin('subsref', x, s)
>> Accessed correctly
Điều đó cũng đúng như mong đợi. Nhưng, khi tôi thử phương pháp tương tự trên TestBuiltIn:
builtin('subsref', t, s)
>> This is the overloaded method
... Matlab gọi phương thức quá tải thay vì phương pháp được tích hợp sẵn. Tại sao Matlab gọi phương thức bị quá tải khi tôi yêu cầu phương thức được xây dựng?
CẬP NHẬT: Để trả lời câu trả lời của @Andrew Janke, giải pháp đó hầu như hoạt động nhưng không hoàn toàn. Xem xét lớp này:
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ất cả điều này hoạt động:
t = TestIndexing;
t(1)
>> overloaded method
t.prop1
>> 1
t.child
>> [TestIndexing instance]
t.child.prop1
>> 2
Nhưng điều này không làm việc; Nó sử dụng được xây dựng trong subsref cho đứa trẻ chứ không phải là subsref quá tải:
t.child(1)
>> [TestIndexing instance]
Lưu ý rằng hành vi trên là không phù hợp với cả hai hành vi (được như dự kiến):
tc = t.child;
tc(1)
>> overloaded method
x.child = t.child;
x.child(1)
>> overloaded method
Không chắc chắn nếu tôi hoàn toàn hiểu, nhưng tôi nghĩ rằng đầu tiên hàm dựng sẵn được gọi, và sau đó trong cuộc gọi đó phương thức nạp chồng được gọi. Nếu có thể đặt một điểm dừng ở một vị trí hữu ích. –
Một cái gì đó hoàn toàn khác nhau: Tôi hy vọng bạn chỉ cần cố gắng làm điều này ra khỏi lợi ích cá nhân, như đối với hầu hết các vấn đề quá tải subsref có thể không phải là giải pháp tốt nhất. –
Tôi không chắc chắn ý nghĩa của hàm dựng sẵn được gọi là đầu tiên - nếu đó là giả thuyết (không chắc chắn như thế nào, nhưng nói), tôi nghĩ tôi sẽ cần thiết lập một điểm ngắt bên trong chức năng subsref được xây dựng của Matlab để xác minh . Nhưng đó là một chức năng bản địa chứ không phải là một hàm m, vì vậy tôi không thể đặt một điểm dừng ở đó. – Ben