《接口和抽象类的区别.pdf》由会员分享,可在线阅读,更多相关《接口和抽象类的区别.pdf(4页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、.Net 提供了接口,这个不同于Class 或者 Struct 的类型定义。接口有些情况,看似和抽象类一样,因此有些人认为在.Net 可以完全用接口来替换抽象类。 其实不然,接口和抽象类各有长处和缺陷,因此往往在应用当中,两者要结合来使用,从而互补长短。接下来先说说抽象类和接口的区别。区别一,两者表达的概念不一样。 抽象类是一类事物的高度聚合, 那么对于继承抽象类的子类来说,对于抽象类来说,属于“是”的关系;而接口是定义行为标准,因此对于实现接口的子类来说,相对于接口来说,是“行为需要按照接口来完成” 。这些听起来有些虚,举个例子。例如,狗是对于所有狗类动物的统称,京哈是狗,牧羊犬是狗,那么狗
2、的一般特性,都会在京哈, 牧羊犬中找到, 那么狗相对于京哈和牧羊犬来说, 就属于这类事物的抽象类型;而对于“叫”这个动作来说, 狗可以叫,鸟也可以叫。很明显,前者相当于所说的是抽象类,而后者指的就是接口。区别二,抽象类在定义类型方法的时候, 可以给出方法的实现部分,也可以不给出;而对于接口来说,其中所定义的方法都不能给出实现部分。例如:public abstract class AbsTestpublic virtual void Test()Debug.WriteLine( Test );public abstract void NewTest();public interface ITes
3、tvoid Test();void NewTest();区别三, 继承类对于两者所涉及方法的实现是不同的。 继承类对于抽象类所定义的抽象方法,可以不用重写,也就是说,可以延用抽象类的方法; 而对于接口类所定义的方法或者属性来说,在继承类中必须要给出相应的方法和属性实现。区别四, 在抽象类中, 新增一个方法的话, 继承类中可以不用作任何处理; 而对于接口来说,则需要修改继承类,提供新定义的方法。知道了两者的区别,再来说说,接口相对于抽象类的优势。好处一,接口不光可以作用于引用类型, 也可以作用于值类型。而抽象类来说,只能作用于引用类型。好处二,.Net 的类型继承只能是单继承的, 也就是说一个类
4、型只能继承一个类型, 而可以继承多个接口。其实,我对于这一点也比较赞同,多继承会使继承树变的混乱。好处三,由于接口只是定义属性和方法, 而与真正实现的类型没有太大的关系, 因此接口可以被多个类型重用。相对于此,抽象类与继承类的关系更紧密些。好处四,通过接口, 可以减少类型暴露的属性和方法,从而便于保护类型对象。当一个实现接口的类型,可能包含其他方法或者属性,但是方法返回的时候, 可以返回接口对象,这样调用端,只能通过接口提供的方法或者属性, 访问对象的相关元素,这样可以有效保护对象的其他元素。好处五,减少值类型的拆箱操作。对于Struct 定义的值类型数据,当存放集合当中,每当取出来,都需要进
5、行拆箱操作,这时采用Struct+Interface结合的方法,从而降低拆箱操作。参看如下文章提供的方法。相对于抽象类来说, 接口有这么多好处,但是接口有一个致命的弱点, 就是接口所定义的方法和属性只能相对于继承它的类型除非在继承类中修改借口定义的函数标示 ,那么对于多层继承关系的时候, 光用接口就很难实现。 因为如果让每个类型都去继承接口而进行实现的话,首先不说编写代码比较繁琐, 有时候执行的结果还是错误, 尤其当子类型对象隐式转换成基类对象进行访问的时候。那么这时候,需要用接口结合虚方法来实现。参看 IDisposable 在继承类型中的实现方法。其实在继承中,到底使用接口还是抽象类。接口
6、是固定的,约定俗成的,因此在继承类中必须提供接口相应的方法和属性的实现。而对于抽象类来说,抽象类的定义方法的实现,贯穿整个继承树,因此其中方法的实现或者重写都是不确定的。 因此相对而言,抽象类比接口更灵活一些。如下给出两者的简单比照表格。接口 抽象类多继承 支持 不支持类型限制 没有 有,只能是引用类型方法实现 继承类型中必须给出方法实现 继承类中可以不给出扩展性 比较麻烦 相比照较灵活多层继承 比较麻烦,需要借助虚函数 比较灵活总的来说,接口和抽象类是.Net 为了更好的实现类型之间继承关系而提供的语言手段,而且两者有些相辅相成的关系。因此我并不强调用什么而不用什么,那么问题的关键在于,如何把这两种手段合理的应用到程序当中,这才是至关重要。