2015-09-04 5 views
0

У меня есть класс handle, т. Е. 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

Да, ошибка была одним из моих обходных решений, но могу ли я сделать это полностью внутри программы? я имею в виду, что ничего не должно отображаться в окне команд (особенно уродливое 'Ошибка с использованием xxx (строка yyy)' 'error'), пользователям просто нужно сообщить, что они ошибочно вошли, им не нужно заботиться о где в какой функции ошибка была ... – scmg

+1

Вам тогда понадобилось бы использовать try, catch и wrap class creation внутри другой функции, которая выполняет try, catch. Я не могу думать о другом. – Navan

 Смежные вопросы

  • Нет связанных вопросов^_^