我对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
关键字的确切用法是什么?我有几个问题需要澄清:
base
关键字将调用基类A
构造函数(在我们的示例中)?这是对的吗?base
关键字会更改派生类构造函数的行为吗?基本上在构造函数中应该使用base
关键字时(某些示例会很好)?
我有另一个问题。如何通过base
关键字向derived
课程通知我们的base
课程?
提前致谢。
答案 0 :(得分:6)
是 - base
链到基类中的构造函数。
如果你不指定base
或this
(链接到相同类中的另一个构造函数),效果如下如果你有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)
是的,这会调用基类构造函数。
派生构造函数始终调用基类构造函数;如果你没有指定一个,它将尝试调用无参数构造函数(如果存在)。这个语法允许你将参数传递给特定的基类构造函数。请注意,在这种情况下,没有没有参数的公共或受保护的基类构造函数,因此您需要使用带参数的“base”语法。