1、抽象类是可以有构造函数的。但很多人认为,构造函数用于实例化一个对象(或建立一个对象的实例),而抽象类不能被实例化,所以抽象类不应该有公共的构造函数(FxCop.设计规则)。但不应该有“公共”的构造函数,和不应该有构造函数,这是两个不同的概念,所以,FxCop.设计规则中也说,如果抽象类需要构造函数,那么应该声明为“protected”。
2、既然抽象类是可以,甚至有时候应该有构造函数,那抽象类的构造函数的作用是什么?我觉得至少有两个:
(1)初始化抽象类的成员;
(2)为继承自它的子类使用。
比如以下例子:
[c-sharp] view plaincopyprint?
01.public abstract class Component
02.{
03. protected string name;
04.
05. public Component(string name)
06. {
07. this.name = name;
08. }
09.
10. public abstract void Add(Component component);
11. public abstract void Remove(Component component);
12.}
13.
14.public class Composite : Component
15.{
16. private List<Component> children = new List<Component>();
17.
18. public Composite(string name)
19. : base(name)
20. { }
21.
22. public override void Add(Component component)
23. {
24. this.children.Add(component);
25. }
26.
27. public override void Remove(Component component)
28. {
29. this.Remove(component);
30. }
31.}
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、即使我们声明一个没有构造函数的抽象类,编译器还会为我们生成一个默认的保护级别的构造函数。子类实例化时(不管是否为带参构造)只会调用所有父类的无参构造函数,而带参构造必须通过显式去调用.调用顺序是先调用抽象类的无参构造函数,如果子类实例化时是使用带餐的构造函数,则再接着调用抽象类的带参构造函数,最后调用子类本身的构造函数。