请看一下这个例子:
public class X {
public X() {
MessageBox.Show("I'm X");
}
}
public class Y : X {
public Y() {
MessageBox.Show("I'm Y");
}
}
执行命令Y y = new Y();
时,两个消息框首先出现“我是X”然后“我是Y”。
我怎样才能摆脱这种行为?我需要的是在制作新的Y时停止X的构造函数。
感谢。
答案 0 :(得分:2)
除非您专门调用另一个构造函数,否则将调用X中的默认构造函数。 试试这个:
public class X {
public X() {
MessageBox.Show("I'm X");
}
protected X(int dummy){
}
}
public class Y : X {
public Y() : X(0) { //will call other constructor
MessageBox.Show("I'm Y");
}
}
这只会使默认构造函数不被调用。但是,基于你的问题 - “我需要的是在制作一个新的Y时停止X的构造函数。”,我不确定你是否理解对象继承的基础...如果你不想创建一个新X在创建新Y时,为什么要从X派生Y?你知道继承是一种关系,对吧?在你的情况下,Y是一个X ......
答案 1 :(得分:2)
您可以使用工厂方法:
public class X {
private X() {}
protected virtual void Init(){
MessageBox.Show("I'm X");
}
public static GetX() {
X ret = new X();
ret.Init();
return ret;
}
}
public class Y : X {
private Y() {}
protected virtual void Init(){
MessageBox.Show("I'm Y");
}
public static GetY() {
Y ret = new Y();
ret.Init();
return ret;
}
}
答案 2 :(得分:0)
:)
考虑到,Y是X的子类型。更具体地说,Y需要和X是完整的。所以,如果你构造一些Y,它需要能够以某种的方式创建一个X.也就是说,您需要始终调用 构造函数,但哪一个取决于您。您可以通过Luchian答案中的策略指定哪一个:
public Y () : X (...) {
其中,您根据参数提名X的构造函数。
答案 3 :(得分:0)
这可以解决问题,但可能你应该避免在构造函数中做任何事情。 构造函数应仅用于初始的初始化
public class X
{
public X()
{
if( this.GetType() == typeof(X) )
Console.WriteLine(( "I'm X" ));
}
public class Y : X
{
public Y()
{
Console.WriteLine(( "I'm Y" ));
}
}
class Program
{
static void Main(string[] args)
{
Y y = new Y();
}
}
}