接口与抽象类

原创 2007年10月03日 11:43:00

接口与抽象类的区别
1 接口可以多重继承,但是抽象类不可以;   接口为了实现系统中的松偶合度.
2 抽象类与子类,是父子关系; 而接口则不是,是松偶合的关系.
3 抽象类能够定义方法的实现;   接口不能包含方法的实现。
4 最大的区别是由抽象类可以派生出一些成员的实现,但接口却不包含任何成员的实现
5 如果继承一个抽象类,当你类更新时,所有的子类都会跟着更新;而接口是一成不变的,一旦发布了一个接口,永远不要再更改它
6 少量的的接口
7 抽象类可以有实现的过程,而接口没有
8 抽象类可以重载
9 你只能继承一个抽象类,而接口被继承的同时还可以继承其它类和接口
10 接口:
接口可以有静态成员、嵌套类型、抽象、虚拟成员、属性和事件。实现接口的任何类都必须提供

接口中所声明的抽象成员的定义。接口可以要求任何实现类必须实现一个或多个其他接口。

对接口有以下限制:

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


抽象类:
抽象类与接口紧密相关,它们不能示例化,并且常常部分实现或根本不实现。抽象类和接口之间的一个主要差别是:类可以实现无限个接口,但仅能从一个抽象(或任何其他类型)类继承。从抽象类派生的类仍可实现接口。可以在创建组件时使用抽象类,因为它们使您得以在某些方法中指定不变级功能,但直到需要该类的特定实现之后才实现其他方法。抽象类也制定版本,因为如果在派生类中需要附加功能,则可以将其添加到基类而不中断代码。

11 接口是非常简单、原始的东西,例如没有设计传递性(IA应用IB,IC应用IA,但是IC并不具有IB接口,此时只能让IC额外应用IB接口),不能用来复用代码流程等。如果你的类继承了接口IA,那么当IA稍有修改的时候,所有应用了IA的代码都会垮掉,必须重新写。

抽象类仅仅是因为有个别内容暂时决定不了,大部分内容还是在高层次就说清楚的用来继承的。如果你在高层次就全是虚拟的,那么这个类是完全空洞的,此时机非常像接口了(尽管仍然比接口方便一些,例如具有设计传递性)。但是.net、java等不支持多重继承,相比c++的能力要差很远。

功能强大的、面向逻辑、面向对象、具有现成的自动化控制逻辑的编程方式总是被只会琐碎、顺序地编程的人妖魔化。只会c的人妖魔化c++,只会接口的人妖魔化继承,等等。其实任何东西都不是不必要的,你看java的各种系统、.net的类库,简单看一下源代码到底哪些东西在对系统结构的实用性起关键作用,难道它们用接口来替代了继承了吗?

空洞的类没有什么价值,尽量设计有实质内容的类。这就在实用性、内容上与接口清楚地分开了。

但是很遗憾.net、java不支持多重继承,不得不用接口来勉强模拟。

传统的COM等标准也不支持多重继承。被逼无奈,那些开发世界上最实用、最赚钱的个人系统的应用大师(而不是那些书写各种规范的大学教授们)大量使用object类型,以便使用后期绑定的各种技巧来模拟只有多重继承才具有的功能。范型有点缓解这些object造成的问题。

 


=========================================================================
抽象方法是必须实现的方法。就象动物都要呼吸。但是鱼用鳃呼吸,猪用肺呼吸。
动物类要有呼吸方法。怎么呼吸就是子类的事了。
现在有很多讨论和建议提倡用interface代替abstract类,两者从理论上可以做一般性的混用,但是在实际应用中,他们还是有一定区别的。抽象类一般作为公共的父类为子类的扩展提供基础,这里的扩展包括了属性上和行为上的。而接口一般来说不考虑属性,只考虑方法,使得子类可以自由的填补或者扩展接口所定义的方法,就像JAVA王子所说的事件中的适配器就是一个很好的应用。
用一个简单的例子,比如说一个教师,我们把它作为一个抽象类,有自己的属性,比如说年龄,教育程度,教师编号等等,而教师也是分很多种类的,我们就可以继承教师类而扩展特有的种类属性,而普遍属性已经直接继承了下来。
而接口呢~还是拿教师做例子,教师的行为很多,除了和普通人相同的以外,还有职业相关的行为,比如改考卷,讲课等等,我们把这些行为定义成无body的方法,作为一个集合,它是一个interface。而教师张三李四的各自行为特点又有不同,那么他们就可以扩展自己的行为body。从这点意义上来说,interface偏重于行为。
总之,在许多情况下,接口确实可以代替抽象类,如果你不需要刻意表达属性上的继承的话。

 

抽象类与接口(对比总结)

1、先记着这一点,帮助你理解哦。 答:抽象类最最重要的就是比普通的类多了个抽象方法,另外还有……我觉得这得慢慢再去悟……。 2、接口有的,抽象类都有,但是抽象类有的,接口就不一定有了。 ...
  • cadi2011
  • cadi2011
  • 2016年02月14日 22:46
  • 797

接口和抽象类的区别---相信你看完不会再混淆了

一、引言 我想,对于各位使用面向对象编程语言的程序员来说,“接口”这个名词一定不陌生,但是不知各位有没有这样的疑惑:接口有什么用途?它和抽象类有什么区别?能不能用抽象类代替接口呢?而且,作为程序员,一...
  • wenwen091100304
  • wenwen091100304
  • 2015年09月12日 11:09
  • 22824

浅析C#中抽象类和接口的区别

文章《浅析C#中接口的重要性》中讲述了如何声明和使用接口。但是C#具有abstract关键字形成的抽象类,那么二者我们该如何选择呢!C#允许把类和函数声明为abstract。抽象类不能实例化,而抽象函...
  • wangshubo1989
  • wangshubo1989
  • 2015年09月01日 09:00
  • 3551

PHP中的抽象类和接口

抽象类 PHP5支持抽象类和抽象方法,类前加abstract,此类变成了抽象类,无法被实例化,此类天生就是用来被继承的,给子类提供一个模板; 方法前加abstract,是抽象方法,抽象方法不能有方...
  • qq_29631251
  • qq_29631251
  • 2017年01月13日 16:31
  • 251

java提高篇(四)-----抽象类与接口

接口和内部类为我们提供了一种将接口与实现分离的更加结构化的方法。        抽象类与接口是java语言中对抽象概念进行定义的两种机制,正是由于他们的存在才赋予java强大的面向对象的能力。他们两...
  • chenssy
  • chenssy
  • 2013年10月18日 21:04
  • 142338

抽象类,接口继承与实现关系

1.接口    接口相当于一个比抽象类更加抽象的事务,它本身不能有变量,只能持有静态常量和抽象方法,虽然接口定义方法可以不用添加abstract关键词,但是默认是抽象的,所以不能实现之    一个...
  • linshao512
  • linshao512
  • 2012年10月05日 19:47
  • 5087

总结抽象类与接口的关联和区别

对于面向对象编程来说,抽象是它的一大特征之一。在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类。这两者有太多相似的地方,又有太多不同的地方。很多人在初学的时候会以为它们可以随意互换使用,...
  • hupoling
  • hupoling
  • 2016年09月06日 10:26
  • 562

抽象类及接口在设计时考虑的如何选择问题

关于抽象类和接口的相关视频里有,这就不说了,老房问了一个特别无语的问题,用我的话说就是钻牛角尖,但是这也涉及到了设计层面的犯愁,所以我还是找找了资料看看了,下边简单的给大家说说吧。 老房的问题是,如...
  • dreamsky1989
  • dreamsky1989
  • 2012年03月25日 04:43
  • 1109

java中抽象类和接口之间的区别和关系

首先抽象类归根结底还是属于类,对于抽象方法,是只能存在于抽象类中的,我们无法再一个非抽象的类中声明一个抽象方法,其次抽象方法只需要声明,并不需要事先。当我们要写一个抽象类的时候只需要在类的前面声明为a...
  • ysayk
  • ysayk
  • 2016年06月12日 23:08
  • 1178

接口和抽象类的联系和区别

一 接口和抽象类的相似性 1 接口和抽象类都不能被实例化,它们都位于继承树的顶端,用于被其他类实现和继承。 2 接口和抽象类都可以包含抽象方法,实现接口或继承抽象类的普通子类都必须实现这些抽象方法...
  • chengqiuming
  • chengqiuming
  • 2017年04月12日 09:57
  • 3057
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:接口与抽象类
举报原因:
原因补充:

(最多只允许输入30个字)