我有以下情况:
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()构造函数时,由于某些原因我不会不符合程序输出的是“一个名为”的构造函数。
请帮忙解释一下!
谢谢!
答案 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");
}
}