2

在下面的代码中,我创建了一个 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
4

4 回答 4

1

由于B继承自A,它将隐式转换为A。所以...

A a = new B()

创建一个新B对象,然后强制转换为一个A对象。

您看到“A”和“B”的输出的原因B是调用A构造函数。使用无参数构造函数,没有必要显式调用: base(),但它仍在发生,因此您的输出。

基类构造函数总是在子类构造函数的方法体之前调用。如果您的构造函数中有参数,这对您来说会更明显,并且您必须显式调用base. 事实上,C# 不会让你把它写出来,你也不能“看到”它。

于 2018-08-11T05:19:15.647 回答
1

这就是 C# 的工作原理。

由于B继承自A,您的变量a是类的实例,也是类B的实例A

在 C# 中,这意味着按抽象顺序调用两个构造函数,从最通用的类​​ ( A) 到最具体的类 ( B)。

这就是为什么您首先在控制台中获得“A”然后是“B”。

希望这可以帮助。

于 2018-08-11T05:24:25.543 回答
0

如果你想在下一次继承中重写构造函数,这样写

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

这个输出:

在此处输入图像描述

于 2018-08-11T05:30:30.363 回答
0

这是继承的一个例子。

Now when you call A a=  new B(); 

在上面的语句中,实际上创建了 B 类对象。什么是 B 类?B 是 A + B 特有的一些其他功能的组合。

现在,当您创建 B 的实例时,它需要处于有效状态的 A 中的任何内容。像变量或其他一些初始化。所以要做到这一点,首先 A 被调用,然后 B 被调用。

于 2018-08-11T05:27:34.510 回答