在我编写的 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/