【问题标题】:Two abstact classes with constructors, which does base class inherit两个带有构造函数的抽象类,基类继承
【发布时间】:2017-09-28 21:40:50
【问题描述】:

今天面试被问到在C#中抽象类“C”是否被抽象类“B”继承,具体类“A”继承“B”,如果“A”没有,则使用哪个构造函数有一个,我假设“C”,因为父母有优先权但不确定。

【问题讨论】:

  • 每个类都有一个构造函数,并且构造函数不是继承的(以继承方法的方式)。如果您自己不编写构造函数,编译器会为您生成一个。在这种情况下,编译器将为 A 生成一个默认构造函数,该构造函数调用 B 的默认构造函数。
  • @MichaelLiu 是的,除了static 类,当然它没有实例构造函数。

标签: c# inheritance abstract-class


【解决方案1】:

这形成了A <- B <- C 的类层次结构,因此两者都以特定顺序使用和调用。

abstract class C
{
    public C()
    {
        Console.WriteLine("C()");
    }
}

abstract class B : C
{
    public B()
    {
        Console.WriteLine("B()");
    }
}

class A : B
{
}

void Main()
{
    A a = new A();
}

输出:

C()
B()

在 C# 中,您不需要显式调用基本构造函数,它将被隐式调用。因此默认构造函数A() 将调用B(),而C() 将调用。


如果构造函数签名不同呢?

如果BC 的构造函数有参数(没有可用的无参数构造函数),那么编译器会强制您使用base 关键字提供参数。

abstract class C
{
    public C(int foo)
    {
        Console.WriteLine("C()");
    }
}

abstract class B : C
{
    public B()
        : base(0 /* foo must be provided */)
    {
        Console.WriteLine("B()");
    }
}

【讨论】:

  • 构造函数是否可以不同,例如 1 带参数而 1 不带参数?
  • @MilesMorales 是的,看看我包含的void Main() 方法。那是new A();的输出
  • 是的,刚刚注意到,对不起,如果构造函数签名不同呢?
  • @MilesMorales 编译器会强制您在派生类中调用 base,请参阅我的更新
猜你喜欢
  • 2011-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-06
  • 1970-01-01
  • 1970-01-01
  • 2018-11-29
  • 2015-12-10
相关资源
最近更新 更多