Oop 无一例外地取消MATLAB对象构造?
在我正在编写的一个MATLAB类中,如果为构造函数提供了0个参数,则会要求用户使用Oop 无一例外地取消MATLAB对象构造?,oop,matlab,Oop,Matlab,在我正在编写的一个MATLAB类中,如果为构造函数提供了0个参数,则会要求用户使用uigetfile提供一个文件。如果用户取消提示,uigetfile返回0。在这种情况下,创建对象是没有意义的。是否有某种方法可以在不引发异常的情况下取消对象构造?如果我提前返回,我会得到一个无法使用的格式错误的对象。下面是代码的样子: classdef MyClass methods function self = MyClass(filename) if narg
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希望zero-arg构造函数总是返回带有某种默认值的标量对象,因为在数组扩展等过程中填充元素时会隐式调用zero-arg。它基本上被用作原型。是的。只需使构造函数需要一个好的文件名,并将条件内容放在外部。如果你想标准化它,你可以把它放在一个静态工厂方法中。关于MATLAB对象是如何构造的有趣的东西。正如其他人所建议的,我最终从构造函数中删除了用户交互。这也使我的代码变得非常简单,很明显,如果文件名是必须参数,我建议删除所有这些gui内容。您可以通过简单的断言为用户提供帮助:assert(nargin==1,‘必须提供文件名!');