C# 隐藏继承类的构造函数

C# 隐藏继承类的构造函数,c#,oop,inheritance,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=newy(),出现两个消息框-首先是“我是X”,然后是“我是Y” 我怎样才能摆脱这种行为?在创建新的Y时,我需要停止X的构造函数,

请看一看这个例子:

public class X
{
    public X()
    {
        MessageBox.Show("I'm X");
    }
}

public class Y : X
{
    public Y()
    {
        MessageBox.Show("I'm Y");
    }
}
执行命令时
Y Y=newy(),出现两个消息框-首先是“我是X”,然后是“我是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是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是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 {
    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;
    }
}

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

public Y () : X (...)

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

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

public Y () : X (...)

其中,您可以根据参数选择
X
的构造函数。

这就可以了,尽管您可能应该避免在构造函数中执行任何操作。构造函数只能用于初始初始化

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

这就可以了,尽管您可能应该避免在构造函数中执行任何操作。构造函数只能用于初始初始化

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