我有两个构造函数
MyObj(String s){ //first constructor
...
if(s==null) s = somecode;
this.s = s;
...
}
MyObj(): this(null) { } //second constructor
这样,如果调用空构造函数,它将重定向到第一个构造函数并初始化由某些代码确定的值。
但是,现在我有了第三个构造函数
MyObj(Stream st){ //third constructor
...
}
现在第二个构造函数不知道是应该调用第一个构造函数还是第三个构造函数。如何告诉它调用第一个构造函数?我试过了MyObj(): this(String s = null)
,但它也无效。
答案 0 :(得分:10)
也许:MyObj(): this((string) null) {}
?
答案 1 :(得分:1)
我经常发现通过对具有多个构造函数的类使用初始化方法来保护我的理智更容易。一个
private void Init(string str, Stream stream, bool doOtherStuff)
{
// do stuff, replace nulls with defaults, etc
}
由每个构造函数调用,允许构造函数本身执行自己的操作。我真的不喜欢构造函数调用其他构造函数,因为它可能很容易混淆,有些东西可能无法初始化......或者某些内容可以多次初始化。
答案 2 :(得分:1)
我同意Siege。不要尝试链接构造函数,而是使用可以根据需要从每个ctor调用的Init函数。
答案 3 :(得分:0)
添加我的位。
我还建议用静态CreateXXX方法替换多个构造函数,而不是将构造函数设为私有。
这对您的类的用户更明确,其中用户可以调用他感兴趣的create方法并仅传递相关参数。而不用担心对象还有什么。
答案 4 :(得分:0)
我认为下一段代码会更好。
MyObj(String s) //first constructor
{
...
this.s = s;
...
}
MyObj() //second constructor
{
this(somecode);
}
MyObj(Stream st) //third constructor
{
...
}
我的示例表明,您可以避免在第一个构造函数上检查null。如果第一个构造函数的字符串s可为空,则使用第二个构造函数可提高代码的可读性