2015-09-04 70 views
0

我有一个句柄类,例如下面的mclass,它应该在具有相应输入参数的另一个函数内部构建。但是,我想检查类构造函数的输入参数在类本身的任何地方的构造函数中,并防止创建新的对象句柄,如果输入不是所需的类型。matlab oop - 我如何处理构造函数的输入?

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被创建?

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

回答

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 
+0

是的,'错误'是我的一个解决方法,但是我可以让它完全发生在程序中吗?我的意思是,在命令窗口中不应该显示任何内容(特别是'error使用xxx(line yyy)'error'的错误),用户只需要知道他们错误地输入了什么,他们不需要关心在哪个函数中错误是...... – scmg

+1

然后,您需要使用try,catch和wrap类创建内部另一个函数try,catch。我想不出另一种方式。 – Navan