【发布时间】:2013-04-11 20:50:18
【问题描述】:
我正在编写一个实现自定义连接的 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 文档没有解释上述结果,我想避免基于我对语言工作原理的幻想来开发代码。
提前感谢您的意见。
【问题讨论】:
标签: oop matlab overloading