1,如果基类没有提供默认构造函数,派生类必须使用 base 显式调用基构造函数。
这是从MSDN上看到的一句话(参考http://msdn.microsoft.com/zh-cn/library/ms173115(v=VS.80).aspx)
一开始还真没太引起过注意,最近才发现这个问题,实例如下
class B
{
}
class BB : B
{
public BB(int i)
{ }
}
class BBB : BB
{
public BBB(int i)
{ }
}
这个时候编译器在BBB类中报错说 BB类中没有不带参数的构造函数
而BB类之所以没报同样的错误,是因为B类中会自动添加不带参数的构造函数,
解决办法,当然是在BB类中加上默认的构造函数了,可实际项目中又不想声明不带参数的实例(禁用new BBB())
所以只能在BBB类中使用 base 显式调用基构造函数。
改造如下
class BBB : BB
{
public BBB(int i)
: base(i)
{ }
}
问题解决。
2.关于构造函数使用 base的执行顺序及结果
实例如下
class A
{
public A(int i)
{
Index = i + 1;
Console.WriteLine("A:" + Index.ToString());
}
public int Index
{ get; set; }
}
class AA : A
{
public AA(int i)
: base(i)
{
Index = i;
Console.WriteLine("AA:" + Index.ToString());
}
}
调用:
AA aa = new AA(10);
Console.WriteLine(aa.Index.ToString());
结果:
A:11
AA:10
10
由此可见,首先执行了父类A的构造函数,
然后执行AA的构造函数,
并且AA的构造函数覆盖了A构造函数,所以aa.Index结果为10