如何重载horzcat()的工作原理?

时间:2013-04-11 20:50:19

标签: oop matlab overloading

我正在编写一个实现自定义连接的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文档没有解释上面的结果,我想避免根据我对该语言如何工作的幻想来开发代码。

提前感谢您的意见。

1 个答案:

答案 0 :(得分:2)

我认为MATLAB的文档很清楚:

来自here

  

MATLAB使用显性参数来确定哪个版本的   打电话的功能。如果主导参数是一个对象,那么MATLAB   调用由对象类定义的方法(如果有的话)。

here更多关于主导论点

  

方法参数列表中的主导参数决定了哪一个   MATLAB运行时调用的方法或函数的版本。   优势由类别的相对优先级决定   争论。通常,用户定义的类优先于   内置MATLAB类。因此,最左边的参数确定   要调用的方法。但是,用户定义的类可以指定   特定阶级的相对优势。