C# 为什么两个构造函数都被调用?
在下面的代码中,我正在创建一个类B的对象,因此只有B的构造函数应该打印。为什么A和B都要打印C# 为什么两个构造函数都被调用?,c#,oop,C#,Oop,在下面的代码中,我正在创建一个类B的对象,因此只有B的构造函数应该打印。为什么A和B都要打印 namespace CodeTester { class Program { public static void Main(string[] args) { A a = new B(); Console.ReadLine(); } } class A {
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
由于
B
继承自A
,因此它将隐式转换为A
。所以
A a = new B()
创建一个新的B
对象,然后将其转换为a
对象
您看到“A”和“B”的输出的原因是B
正在调用A
构造函数。对于无参数构造函数,无需显式调用:base()
,但它仍在发生,因此您的输出
基类构造函数总是在子类构造函数的方法体之前调用。如果您的构造函数中有参数,并且必须显式调用base
,这对您来说会更明显。事实上,C#不能让你把它写出来,你也看不到它。这就是C#的工作原理
由于
B
继承自A
,因此变量A
既是类B
的实例,也是类A
的实例
在C#中,这意味着两个构造函数都是按抽象顺序从最通用的类(A
)调用到最具体的类(B
)
这就是为什么您首先在控制台中得到“A”,然后是“B”
希望这有帮助。这是一个继承的例子
Now when you call A a= new B();
在上面的语句中,实际上创建了类B对象。什么是B级?B是A+特定于B的一些其他功能的组合
现在,当您创建B的实例时,它需要处于有效状态的A中的任何内容。比如变量或其他初始化。所以要做到这一点,首先调用A get,然后调用B get。如果您想在下一个继承中重写构造函数,请这样编写
class Program
{
static void Main(string[] args)
{
A a = new B();
}
}
public class A
{
public A()
{
DoIt();
}
public virtual void DoIt()
{
Console.WriteLine("A");
}
}
public class B:A
{
public B()
{
}
public override void DoIt()
{
Console.WriteLine("B");
}
}
此输出:
因为B继承自A。继承不重写构造函数