oop - 无一异常(exception)地取消 MATLAB 对象构造?

标签 oop matlab

在我编写的 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 是否正确。也许这应该是我代码的另一部分的责任。

最佳答案

在现代 Matlab 对象中,我不认为在不返回构造对象或抛出错误的情况下退出构造函数是不可能的。 (在旧式类中,构造函数实际上被允许返回它想要的任何东西,包括对象或其他类型的基元,天哪,这会变成一团糟。)调用构造函数时,输出参数已经初始化使用具有默认属性值的对象,因此当您在那里调用 return 时,它只是跳过其余的初始化并返回对象。如果您尝试用 MyClass 对象以外的东西替换 out,那就是错误。

只需重新组织控制流,将 GUI 代码从构造函数中提取出来,就像您最后推测的那样。将它混合到构造函数中,尤其是有条件地,可能会导致问题。特别是,Matlab 期望零参数构造函数始终返回具有某种默认值的标量对象,因为在数组扩展等期间填充元素时会隐式调用零参数。它基本上用作原型(prototype)。

关于oop - 无一异常(exception)地取消 MATLAB 对象构造?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9929046/

相关文章:

Matlab顺序乘法3D矩阵

php - 无法使用 bindValue() 将值添加到 pdo 对象

oop - 使用复数来命名集合是一种好习惯吗?

matlab - 为 MATLAB 追加

Matlab 索引到逻辑索引

matlab - 遍历作为单元格一部分的特定向量

c++ - 设计面向对象的同步接收机和发射机

javascript - 探索 MooTools 中的实现/扩展

ios - 如何修改依赖注入(inject)模式中的对象

Matlab:打印符号方程