2

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

预先感谢您的意见。

4

1 回答 1

2

我认为 MATLAB 的文档对此非常清楚:

这里

MATLAB 使用占主导地位的参数来确定要调用哪个版本的函数。如果主要参数是一个对象,则 MATLAB 调用该对象的类定义的方法(如果有的话)。

这里开始更多关于主导论点

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

于 2013-04-11T21:06:04.880 回答