【问题标题】:matlab oop - how could i handle input of constructor?matlab oop - 我如何处理构造函数的输入?
【发布时间】:2015-11-30 20:46:38
【问题描述】:

我有一个句柄类,即下面的mclass,它应该在另一个具有相应输入参数的函数中构造。但是,我想在类本身的任何地方的构造函数中检查类构造函数的输入参数,并防止在输入不是所需类型时创建新的对象句柄。

classdef mclass < handle
    properties
        val
    end
    properties (Dependent)
        sval
    end
    methods
        function obj = mclass(varargin)
            if nargin == 1
                if isnumeric(varargin{1}) && varargin{1} > 0
                    obj.val = varargin{1};
                else
                    errordlg('Invalid input', 'Constructor', 'modal');
                end
            else
                errordlg('No input', 'Constructor', 'modal');
            end
        end
        function s = get.sval(obj)
            s = sqrt(obj.val);
        end
    end
end

但是,在命令行窗口调用m = mclass;m = mclass(0); 后,连同错误对话框,变量m 仍然在工作区中创建。如何防止创建m

当然我可以在调用构造函数之前检查我的其他函数中的输入,但是无论如何让它成为类的“自检”特性?

【问题讨论】:

    标签: matlab oop matlab-class


    【解决方案1】:

    errordlg 不会停止程序执行。它只显示对话框。要另外停止您的程序,您需要发出对错误的调用。您可以将两者结合起来使用以下行,这将在您发出错误时停止对象创建。

    function obj = mclass(varargin)
        if nargin == 1
            if isnumeric(varargin{1}) && varargin{1} > 0
                obj.val = varargin{1};
            else
                errordlg('Invalid input', 'Constructor', 'modal');
                error('Invalid input for Constructor of mclass');
            end
        else
            errordlg('No input', 'Constructor', 'modal');
            error('No input for Constructor of mclass');
        end
    end
    

    【讨论】:

    • 是的,error 是我的解决方法之一,但我可以让它完全在程序中发生吗?我的意思是,命令窗口中不应该显示任何内容(尤其是丑陋的Error using xxx (line yyy)error),用户只需要被告知他们错误输入了什么,他们不需要关心错误在哪个函数中是...
    • 然后您需要使用 try,catch 并将类创建包装在另一个执行 try,catch 的函数中。我想不出别的办法了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-27
    • 1970-01-01
    相关资源
    最近更新 更多