在我写的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
Run Code Online (Sandbox Code Playgroud)
但是我不确定uigetfile
在构造函数中使用是否正确.也许它应该是我的代码的另一部分的责任.
在现代的Matlab对象中,我认为如果不返回构造对象或抛出错误,就不可能离开构造函数.(在旧样式类中,构造函数实际上被允许返回它想要的任何内容,包括其他类型的对象或基元,并且可能会导致混乱.)当调用构造函数时,输出参数已经初始化使用具有默认属性值的对象,因此当您return
在那里调用时,它只是跳过剩余的初始化并返回该对象.如果你试图用MyClass对象之外的东西替换,那就是一个错误.
只需重新组织控制流,将GUI代码从构造函数中拉出来,就像最后推测的那样.将其混合到构造函数中,特别是有条件地,可能会导致问题.特别是,Matlab期望零参数构造函数始终返回具有某种默认值的标量对象,因为在数组扩展期间填充元素时会隐式调用zero-arg,依此类推.它基本上用作原型.