zoukankan      html  css  js  c++  java
  • (转)抽象类的构造函数 .

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

  • 相关阅读:
    清除3389远程桌面连接记录的批处理
    Visual Studio Team Foundation Server 2013
    Build fast jar 打包,增加配置文件
    Asp.net MVC 出现“Failed to map the path '/'.”错误
    Java创建AD(Active Directory)域控制器用户 (未测)
    JSP/java 执行创建批处理文件,并执行批处理事务。
    域控密码策略
    项目感悟
    IE版本的标准定义
    VS编译后事件
  • 原文地址:https://www.cnblogs.com/wanshutao/p/3566171.html
Copyright © 2011-2022 走看看