c#静态构造函数和子实例

时间:2014-05-09 15:27:50

标签: c# inheritance constructor static

我有以下情况:

Class A
{
    public static  A instance;

    static A()
    {
        if(condition)
        {
            instance = new B();
        }
        else
        {
            instance = new A();
        }

    }

    public A()
    {
        WriteSomething();
    }

    virtual void WriteSomething()
    {
        Console.WriteLine("A constructor called");
    }

}


Class B : A
{
    public B()
    {
        WriteSomething();
    }

    override void WriteSomething()
    {
        Console.WriteLine("B constructor called");
    }

}

问题是当第一次调用A.instance并且条件 true 并且调用了B()构造函数时,由于某些原因我不会不符合程序输出的是“一个名为”的构造函数。

请帮忙解释一下!

谢谢!

2 个答案:

答案 0 :(得分:1)

A的构造函数将始终首先运行,即使您要创建新的B,因为B扩展了A

您还无意中发现了为什么建议您不要在构造函数中放置虚函数调用(至少在.NET中)。

http://msdn.microsoft.com/en-us/library/ms182331.aspx

“调用虚方法时,直到运行时才会选择执行该方法的实际类型。当构造函数调用虚方法时,调用该方法的实例的构造函数可能尚未执行。 “

答案 1 :(得分:0)

A.WriteSomething()将始终为您提供“一个名为”的构造函数.B.WriteSomething()将始终为您提供“一个名为”的构造函数。但是在构造函数场景中,不会调用override,您可以使用new关键字来创建具有相同名称的新空格。除了虚拟覆盖调用之外,它还可以按照您的方式工作。但是,上面的代码不是一个好的实现。

Class A
{
    public static  A instance;

    static A()
    {
        if(condition)
        {
            instance = new B();
        }
        else
        {
            instance = new A();
        }

    }

    public A()
    {
        WriteSomething();
    }

    public static void WriteSomething()
    {
        Console.WriteLine("A constructor called");
    }

}


Class B : A
{
    public B()
    {
        WriteSomething();
    }

    public static new void WriteSomething()
    {
        Console.WriteLine("B constructor called");
    }

}