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、即使我们声明一个没有构造函数的抽象类,编译器还会为我们生成一个默认的保护级别的构造函数。子类实例化时(不管是否为带参构造)只会调用所有父类的无参构造函数,而带参构造必须通过显式去调用.调用顺序是先调用抽象类的无参构造函数,如果子类实例化时是使用带餐的构造函数,则再接着调用抽象类的带参构造函数,最后调用子类本身的构造函数。
原文:http://www.cnblogs.com/wanshutao/p/3566171.html