【问题标题】:How overloaded horzcat() works?重载的 horzcat() 是如何工作的?
【发布时间】: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


    【解决方案1】:

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

    来自here

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

    来自here 的更多关于主导论点

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

    【讨论】:

    • 好的,解释清楚了。感谢您花时间回答我。 (提醒自己:下次请仔细阅读文档...)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多