2015-09-04 69 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