我正在编写一个实现自定义连接的 Matlab 类,以便向用户呈现一个干净、富有表现力的界面。与内置的不同,重载的结果horzcat()
——例如——应该是根据类的语义设置的标量对象。但是,我不再确定哪些规则适用于重载函数......
一个类来说明这个问题是:
classdef A < handle
properties
k;
end;
methods
function obj = A(varargin)
if nargin == 0
obj.k = 0;
else
obj.k = varargin{1};
end;
end;
function obj = horzcat(obj1, varargin)
fprintf('1st arg is %s.\n', class(obj1));
if nargin > 1
fprintf('2nd arg is %s.\n', class(varargin{1}));
end;
obj = obj1; % Not important
end;
end;
end
现在,当用一个小脚本测试这个类时:
% Please don't run this is you have valuable
% data in your base workspace.
clear classes;
clc;
a = A('dummy');
b = [-1, a]; % Should fail
输出是:
1st arg is double.
2nd arg is A.
horzcat()
这是令人惊讶的,因为第一个参数是双精度的,即应该调用内置函数,随后抛出关于类型不匹配或其他东西的异常。据我了解,第一个参数的类型决定了将调用哪个重载函数(好的,我们将自己限制为非静态方法)。该代码在 R2011b/Linux 和 R2012a/Windows 上进行了测试,结果相同。
所以,这是我的问题:调用重载方法的实际规则是什么?Matlab 文档没有解释上述结果,我想避免基于我对语言如何工作的幻想来开发代码。
预先感谢您的意见。