接口和抽象类的异同点

GPS平台、网站建设、软件开发、系统运维,找森大网络科技!
http://cnsendnet.taobao.com
来自森大科技官方博客
http://www.cnsendblog.com/index.php/?p=513php

什么是接口?
接口是包含一组虚方法的抽象类型,其中每一种方法都有其名称、参数和返回值。接口方法不能包含任何实现,CLR容许接口能够包含事件、属性、索引器、静态方法、静态字段、静态构造函数以及常数。可是注意:C#中不能包含任何静态成员。一个类能够实现多个接口,当一个类继承某个接口时,它不只要实现该接口定义的全部方法,还要实现该接口从其余接口中继承的全部方法。c++

什么是抽象类?
抽象类提供多个派生类共享基类的公共定义,它既能够提供抽象方法,也能够提供非抽象方法。抽象类不能实例化,必须经过继承由派生类实现其抽象方法,所以对抽象类不能使用new关键字,也不能被密封。若是派生类没有实现全部的抽象方法,则该派生类也必须声明为抽象类。另外,实现抽象方法由override方法来实现。编程

相同点 设计模式

都不能被直接实例化,均可以经过继承实现其抽象方法。
都是面向抽象编程的技术基础,实现了诸多的设计模式。 安全

不一样点 网络

接口支持多继承;抽象类不能实现多继承。
接口只能定义抽象规则;抽象类既能够定义规则,还可能提供已实现的成员。
接口是一组行为规范;抽象类是一个不彻底的类,着重族的概念。
接口能够用于支持回调;抽象类不能实现回调,由于继承不支持。
接口只包含方法、属性、索引器、事件的签名,但不能定义字段和包含实现的方法;抽象类能够定义字段、属性、包含有实现的方法。
接口能够做用于值类型和引用类型;抽象类只能做用于引用类型。例如,Struct就能够继承接口,而不能继承类。 运维

MSDN的建议是: ide

若是预计要建立组件的多个版本,则建立抽象类。抽象类提供简单易行的方法来控制组件版本。经过更新基类,全部继承类都随更改自动更新。另外一方面,接口一旦建立就不能
更改。若是须要接口的新版本,必须建立一个全新的接口。
若是建立的功能将在大范围的全异对象间使用,则使用接口。抽象类应主要用于关系密切的对象,而接口最适合为不相关的类提供通用功能。
若是要设计小而简练的功能块,则使用接口。若是要设计大的功能单元,则使用抽象类。
若是要在组件的全部实现间提供通用的已实现功能,则使用抽象类。抽象类容许部分实现类,而接口不包含任何成员的实现。 函数

  1. 结论

接口和抽象类,是论坛上、课堂间讨论最多的话题之一,之因此将这个老话题拿出来再议,是由于从个人体会来讲,深入的理解这两个面向对象的基本内容,对于盘活面向对象
的抽象化编程思想相当重要。本文基本概况了接口和抽象类的概念、异同和使用规则,从学习的观点来看,我认为这些总结已经足以表达其核心。可是,对于面向对象和软件设
计的深刻理解,仍是创建在不断实践的基础上,Scott说本身天天坚持一个小时用来写Demo,那么咱们是否是更应该勤于键盘呢。对于接口和抽象类,请多用而知其然,多想而
知其奥吧。
什么是抽象方法,什么是虚方法
若是一个基类方法要在派生类中被覆盖,就必须把这个基类方法申明为virtual
抽象方法和虚拟方法的区别在于:
虚拟方法有一个实现部分,并为派生类提供了覆盖该方法的选项;相反,
抽象方法没有提供实现部分,强制派生类覆盖方法(不然派生类不能成为具体类) 学习

总结:

  1. 若是一个类所有由抽象方法组成,那就是接口。即接口中的方法都是抽象方法。
  2. 抽象类中的方法能够是抽象方法,也能够是非抽象方法(即普通方法)。
    //在抽象类和接口中,抽象方法和接口方法都不能有方法体,须要依靠继承基类的子类去实现
    //抽象方法必定没有方法体,而虚方法有方法体
    //能够把抽象方法看做是没有方法体的虚方法
    1。在c语言中,函数是采用早期绑定的,即在程序运行以前,编译器就要决定调用那个函数,这个过程叫作静态联编。
    2。动态联编,这项功能在c++中默认是关闭的。开启某个函数的晚期绑定的方式是在此函数的类型前加入virtual关键字,这种采用晚期绑定的函数就称为虚函数。
    引自msdn:
    若一个实例方法的声明中含有 virtual 修饰符,则称该方法为虚拟方法;一个虚拟方法的实现能够由派生类取代。取代所继承的虚拟方法的实现的过程称为重写该方法;在一个虚拟方法调用中,该调用所涉及的那个实例的运行时类型肯定了要被调用的到底是该方法的哪个实现。

    虚函数的限制:

    1.虚函数仅适用于有继承关系的类对象, 因此只有类的成员函数才能说明为虚函数.
    2.静态成员函数不能是虚函数.
    3.内联函数不能是虚函数.
    4.构造函数不能是虚函数.
    5.析构函数能够是虚函数.

    接口能够有静态成员、嵌套类型、抽象、虚拟成员、属性和事件。实现接口的任何类都必须提供接口中所声明的抽象成员的定义。接口能够要求任何实现类必须实现一个或多个其余接口。

    对接口有如下限制:

    接口能够用任何可访问性来声明,但接口成员必须全都具备公共可访问性。
    不能向成员或接口自身附加安全性权限。
    接口能够定义类构造函数,但不能定义实例构造函数。
    每种语言都必须为须要成员的接口映射一个实现提供规则,由于不仅一个接口能够用相同的签名声明成员,且这些成员能够有单独的实现。

    接口能够由类和结构来实现。为了指示类或结构实现了某接口,在该类或结构的基类列表中应该包含该接口的标识符。若是一个类或结构实现某接口,则它还隐式实现该接口的全部基接口。即便在类或结构的基类列表中没有显式列出全部基接口,也是这样。

GPS平台、网站建设、软件开发、系统运维,找森大网络科技!
http://cnsendnet.taobao.com
来自森大科技官方博客
http://www.cnsendblog.com/index.php/?p=513