Base Keyword在构造函数初始化中的作用是什么?

时间:2011-11-17 15:44:43

标签: c# constructor

我对C#中的base关键字感到困惑。说我有这样的代码:

​class A
{
    ​// member declaration....
    A(int s, int t, int x)
    {
        ​// assign the values of members
    }
}

class B : A
{
    // member declaration....
    ​B(int a, int b, int c, int d) : base(a,b,c)
    {
        // does the base keyword play a role in
        // this constructor?
    }
}
​

现在base构造函数中B关键字的确切用法是什么?我有几个问题需要澄清:

  1. 使用base关键字将调用基类A构造函数(在我们的示例中)?这是对的吗?
  2. 在派生类中提供base关键字会更改派生类构造函数的行为吗?
  3. 基本上在构造函数中应该使用base关键字时(某些示例会很好)?

    编辑:

    我有另一个问题。如何通过base关键字向derived课程通知我们的base课程?

    提前致谢。

3 个答案:

答案 0 :(得分:6)

是 - base链到基类中的构造函数。

如果你指定basethis(链接到相同类中的另一个构造函数),效果如下如果你有base()链接到基类中的无参数构造函数。在您的示例中,这将导致编译失败,因为您的基类不拥有无参数构造函数。

有关详细信息,请参阅我的article on constructors

答案 1 :(得分:4)

我认为base上的manual非常明确:

  

base关键字用于从派生类中访问基类的成员:

     
      
  • 在基类上调用已被其他方法覆盖的方法。

  •   
  • 指定在创建派生类的实例时应调用哪个基类构造函数。

  •   
public class BaseClass
{
    int num;

    public BaseClass()
    {
        Console.WriteLine("in BaseClass()");
    }

    public BaseClass(int i)
    {
        num = i;
        Console.WriteLine("in BaseClass(int i)");
    }

    public int GetNum()
    {
        return num;
    }
}

public class DerivedClass : BaseClass
{
    // This constructor will call BaseClass.BaseClass()
    public DerivedClass() : base()
    {
    }

    // This constructor will call BaseClass.BaseClass(int i)
    public DerivedClass(int i) : base(i)
    {
    }

    static void Main()
    {
        DerivedClass md = new DerivedClass();
        DerivedClass md1 = new DerivedClass(1);
    }
}

/*
Output:
in BaseClass()
in BaseClass(int i)
*/

答案 2 :(得分:3)

  1. 是的,这会调用基类构造函数。

  2. 派生构造函数始终调用基类构造函数;如果你没有指定一个,它将尝试调用无参数构造函数(如果存在)。这个语法允许你将参数传递给特定的基类构造函数。请注意,在这种情况下,没有没有参数的公共或受保护的基类构造函数,因此您需要使用带参数的“base”语法。