Отменить конструкцию объекта MATLAB без исключений? - PullRequest
3 голосов
/ 29 марта 2012

В классе MATLAB, который я пишу, если конструктору дается 0 аргументов, пользователю предлагается предоставить файл, используя uigetfile.Если пользователь отменяет запрос, uigetfile возвращает 0.В этом случае нет смысла делать объект.Есть ли способ отменить конструкцию объекта без исключения?Если я сделаю раннее возвращение, я получу уродливый объект, который не может быть использован.Вот как выглядит код:

classdef MyClass
    methods
        function self = MyClass(filename)
            if nargin == 0
                filename = uigetfile;
                if filename == 0
                    %cancel construction here
                    return; %I still get a MyClass object with self.filename == []
                end
            end   
            self.filename = filename;
        end
    end

    properties
        filename;
    end
end

Однако я не уверен, правильно ли использовать uigetfile в конструкторе.Может быть, это должна быть повторяемость другой части моего кода.

1 Ответ

5 голосов
/ 29 марта 2012

В современных объектах Matlab я не думаю, что можно выйти из конструктора, не возвращая построенный объект или не выдавая ошибку.(В классах старого стиля конструктору было разрешено возвращать все, что он хотел, включая объекты или примитивы других типов, и, о человеке, это могло бы превратиться в беспорядок.) Когда вызывается конструктор, выходной аргумент уже инициализированс объектом со значениями свойств по умолчанию, поэтому, когда вы вызываете return, он просто пропускает остальную часть инициализации и возвращает объект.Если вы попытаетесь заменить что-то, кроме объекта MyClass, это ошибка.

Просто реорганизуйте поток управления, чтобы вытащить код GUI из конструктора, как вы спекулировали в конце.Смешивание его с конструктором, особенно условно, может вызвать проблемы.В частности, Matlab ожидает, что конструктор с нулевым аргументом всегда будет возвращать скалярный объект со своего рода значениями по умолчанию, потому что нулевой аргумент вызывается неявно при заполнении элементов во время расширения массива и так далее.Он в основном используется в качестве прототипа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...