隐藏继承类的构造函数

本文关键字:构造函数 继承 隐藏 | 更新日期: 2023-09-27 18:08:50

请看下面的例子:

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();时,出现两个消息框-首先是"I'm X",然后是"I'm Y"。

我怎样才能摆脱这种行为?当创建新的Y时,我需要停止X的构造函数

隐藏继承类的构造函数

将调用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的构造函数",我不确定你是否理解对象继承的基础知识…如果在创建新Y时不想创建新X,为什么要从X导出Y呢?你知道继承是一种关系,对吧?在您的示例中,Y是-a X…

工厂方法:

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;
    }
}

这可以达到目的,不过您可能应该避免在构造函数中执行任何操作。构造函数只能用于初始化。

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

考虑YX的子类型。更具体地说,Y需要X来完成。因此,如果您构建Y,则需要能够以某种方式创建X。也就是说,您需要始终调用构造函数,但具体调用哪一个取决于您。你可以通过Luchian的回答中的策略来指定哪一个:

public Y () : X (...)

根据参数选择X的构造函数