隐藏继承类的构造函数

时间:2011-09-18 11:03:27

标签: c# oop inheritance

请看一下这个例子:

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的构造函数。

感谢。

4 个答案:

答案 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();
     }
    }
    }