转自:http://blog.youkuaiyun.com/newmoon2004/article/details/5951437
1、抽象类是可以有构造函数的。但很多人认为,构造函数用于实例化一个对象(或建立一个对象的实例),而抽象类不能被实例化,所以抽象类不应该有公共的构造函数(FxCop.设计规则)。但不应该有“公共”的构造函数,和不应该有构造函数,这是两个不同的概念,所以,FxCop.设计规则中也说,如果抽象类需要构造函数,那么应该声明为“protected”。
2、既然抽象类是可以,甚至有时候应该有构造函数,那抽象类的构造函数的作用是什么?我觉得至少有两个:
(1)初始化抽象类的成员;
(2)为继承自它的子类使用。
public abstract class Component
{
protected string name;
public Component(string name)
{
this.name = name;
}
public abstract void Add(Component component);
public abstract void Remove(Component component);
}
public class Composite : Component
{
private List<Component> children = new List<Component>();
public Composite(string name)
: base(name)
{ }
public override void Add(Component component)
{
this.children.Add(component);
}
public override void Remove(Component component)
{
this.Remove(component);
}
}
3、即使我们声明一个没有构造函数的抽象类,编译器还会为我们生成一个默认的保护级别的构造函数。
子类实例化时(不管是否为带参构造)只会调用所有父类的无参构造函数,而带参构造必须通过显式去调用。调用顺序是先调用抽象类的无参构造函数,如果子类实例化时是使用带餐的构造函数,则再接着调用抽象类的带参构造函数,最后调用子类本身的构造函数。