在下面的代码中,我创建了一个B类的对象,因此仅应打印B的构造函数。为什么同时打印A和B?
namespace CodeTester
{
class Program
{
public static void Main(string[] args)
{
A a = new B();
Console.ReadLine();
}
}
class A
{
public A()
{
Console.WriteLine("A");
}
}
class B : A
{
public B()
{
Console.WriteLine("B");
}
}
class C : B
{
public C()
{
Console.WriteLine("C");
}
}
}
输出:
A
B
答案 0 :(得分:1)
由于B
继承自A
,因此它将隐式转换为A
。所以...
A a = new B()
创建一个新的B
对象,然后将其强制转换为A
对象。
看到“ A”和“ B”两个输出的原因是B
正在调用A
构造函数。使用无参数的构造函数,不必显式调用: base()
,但它仍在发生,因此需要输出。
总是在子类构造函数的方法主体之前调用基类构造函数。如果您在构造函数中有参数,那么这对您将更加明显,并且您必须显式调用base
。实际上,C#不会让您将其写出来,并且您也无法“看到”它。
答案 1 :(得分:1)
这就是C#的工作方式。
由于B
继承自A
,因此变量a
是类B
的实例,也是类A
的实例。 / p>
在C#中,这意味着按照抽象的顺序,从最通用的类(A
)到最具体的类(B
)调用这两个构造函数。
这就是为什么要先在控制台中获得“ A”然后再获得“ B”的原因。
希望这会有所帮助。
答案 2 :(得分:0)
这是继承的一个例子。
Now when you call A a= new B();
在上面的语句中,实际上创建了B类对象。什么是B级? B是A + B特有的一些其他功能的组合。
现在,当您创建B的实例时,它需要处于A状态且处于有效状态的B。像变量或其他初始化。所以首先要做的是A被调用,然后B被调用。
答案 3 :(得分:0)