(转)抽象类的构造函数.
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、即使我们声明⼀个没有构造函数的抽象类,编译器还会为我们⽣成⼀个默认的保护级别的构造函数。
⼦类实例化时(不管是否为带参构造)只会调⽤所有⽗类的⽆参构造函数,⽽带参构造必须通过显式去调⽤.调⽤顺序是先调⽤抽象类的⽆参构造函数,如果⼦类实例化时是使⽤带餐的构造函数,则再接着调⽤抽象类的带参构造函数,最后调⽤⼦类本⾝的构造函数。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。