(转)抽象类的构造函数 .

 

 

 

 

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

转载于:https://www.cnblogs.com/wanshutao/p/3566171.html

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

表情包
插入表情
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符
相关推荐
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值