先看下边的程序
class A
{
public A()
{
PrintFields();
}
public A(string a)
{
}
public virtual void PrintFields(){}
}
class B:A
{
int x=1;
int y;
public B(string a)
{
y = -1;
}
public override void PrintFields()
{
Console.WriteLine("x={0},y={1}",x,y);
}
}
如果执行: B b = new B("a");会输出X=1,y=0.
因为在实例化子类B时,会先调用基本的无参构造函数,此时X=1而Y并没有初始化,默认值为0,所以输出X=1,y=0,然后才执行B的构造函数,执行y=-1;
如果基类A没有无参构造函数,需要通过base来调用有参的构造函数.
像这样写是不行的.
class A
{
public A(string a)
{
PrintFields();
}
public virtual void PrintFields(){}
}
class B:A
{
int x=1;
int y;
public B(string a)
{
y = -1;
}
public override void PrintFields()
{
Console.WriteLine("x={0},y={1}",x,y);
}
}
必须写成这样
class A
{
public A(string a)
{
PrintFields();
}
public virtual void PrintFields(){}
}
class B:A
{
int x=1;
int y;
public B(string a):base(a)
{
y = -1;
}
public override void PrintFields()
{
Console.WriteLine("x={0},y={1}",x,y);
}
}.
所以如果要写一个基类的话,最好实现一个无参的构造函数,即使这个函数是空的.