A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李帅 中级黑马   /  2012-8-1 18:41  /  2425 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

抽象类和接口都是只声明而不去实现    那他们的区别在哪里呢?

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

8 个回复

正序浏览
区别:
区别一,两者表达的概念不一样。抽象类是一类事物的高度聚合,那么对于继承抽象类的子类来说,对于抽象类来说,属于“是”的关系;而接口是定义行为规范,因此对于实现接口的子类来说,相对于接口来说,是“行为需要按照接口来完成”。
区别二,抽象类在定义类型方法的时候,可以给出方法的实现部分,也可以不给出;而对于接口来说,其中所定义的方法都不能给出实现部分。
区别三,继承类对于两者所涉及方法的实现是不同的。继承类对于抽象类所定义的抽象方法,可以不用重写,也就是说,可以延用抽象类的方法;而对于接口类所定义的方法或者属性来说,在继承类中必须要给出相应的方法和属性实现。
区别四,在抽象类中,新增一个方法的话,继承类中可以不用作任何处理;而对于接口来说,则需要修改继承类,提供新定义的方法。

接口相对于抽象类的优势:
好处一,接口不光可以作用于引用类型,也可以作用于值类型。而抽象类来说,只能作用于引用类型。
好处二,.Net的类型继承只能是单继承的,也就是说一个类型只能继承一个类型,而可以继承多个接口。其实,我对于这一点也比较赞同,多继承会使继承树变的混乱。
好处三,由于接口只是定义属性和方法,而与真正实现的类型没有太大的关系,因此接口可以被多个类型重用。相对于此,抽象类与继承类的关系更紧密些。
好处四,通过接口,可以减少类型暴露的属性和方法,从而便于保护类型对象。当一个实现接口的类型,可能包含其他方法或者属性,但是方法返回的时候,可以返回接口对象,这样调用端,只能通过接口提供的方法或者属性,访问对象的相关元素,这样可以有效保护对象的其他元素。
好处五,减少值类型的拆箱操作。对于Struct定义的值类型数据,当存放集合当中,每当取出来,都需要进行拆箱操作,这时采用Struct+Interface结合的方法,从而降低拆箱操作。

如下给出两者的简单对比表格。
                             接口                                                       抽象类

多继承                   支持                                                       不支持

类型限制                没有                                                       有,只能是引用类型

方法实现                继承类型中必须给出方法实现                    继承类中可以不给出

扩展性                   比较麻烦                                                 相对比较灵活

多层继承                比较麻烦,需要借助虚函数                       比较灵活

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
田向向 发表于 2012-8-1 23:04
哥们看着你面熟啊

都一个学校的   能不熟吗
回复 使用道具 举报
谢谢各位的解惑
回复 使用道具 举报
李晋 发表于 2012-8-1 19:16
抽象类在定义类型方法的时候,可以给出方法的实现部分,也可以不给出;而对于接口来说,其中所定义的方法都 ...

哥们看着你面熟啊
回复 使用道具 举报
★╃小胖╃☆ 发表于 2012-8-1 22:24
抽象类:具有抽象方法的类.但是其中还有非抽象的方法.子类在创建方法的时候,需要实现抽象方法.非抽象方法是 ...

额,你真是无处不在啊
回复 使用道具 举报
一个类只能继承一个抽象类,但可以实现多个接口。
抽象类中的抽象方法描述了一些抽象的事物,例如会英语,会打球,这些可以理解为一些能力,其子类可以不实现父类的所有抽象方法,但这样的话子类也必是抽象的。
接口中的方法描述了一些规则,实现它的类必须实现接口中所有的方法。
接口可以视作特殊的抽象类,其中的方法都是抽象的,而抽象类中的方法可以不都是抽象的。

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
抽象类在定义类型方法的时候,可以给出方法的实现部分,也可以不给出;而对于接口来说,其中所定义的方法都不能给出实现部分.接口定义的是行为规范,如果继承该接口你就得按它的行为规范来做,抽象类是某一事物的高度聚合,如果继承了抽象类就属于这个抽象类。对于接口类所定义的方法或者属性来说,在继承类中必须要给出相应的方法和属性实现,抽象类在定义类型方法的时候,可以给出方法的实现部分,也可以不给出。

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
在博客园中看到这段话我觉得挺有说明度的:
1.飞机会飞,鸟会飞,他们都继承了同一个接口“飞”;但是F22属于飞机抽象类,鸽子属于鸟抽象类。
2. 就像铁门木门都是门(抽象类),你想要个门我给不了(不能实例化),但我可以给你个具体的铁门或木门(多态);而且只能是门,你不能说它是窗(单继承);一个门可以有锁(接口)也可以有门铃(多实现)。 门(抽象类)定义了你是什么,接口(锁)规定了你能做什么(一个接口最好只能做一件事,你不能要求锁也能发出声音吧(接口污染))。

博客源地址是:http://www.cnblogs.com/zhangzheny/archive/2007/12/24/1012790.html

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马