MaoBisheng
Asp.Net(C#) & SQL & Oracle
博客园
::
首页
::
新随笔
::
联系
::
订阅
::
管理
::
71 随笔 :: 0 文章 :: 58 评论 :: 2 引用
(转)C#中抽象类和接口的区别
转载:文章来源不明
C#
中抽象类和接口的区别
一、抽象类:
抽象类是特殊的类,只是不能被实例化;除此以外,具有类的其他特性;重要的是抽象类可以包括抽象方法,这是普通类所不能的。
抽象方法只能声明于抽象类中,且不包含任何实现,派生类必须覆盖它们。
另外,抽象类可以派生自一个抽象类,可以覆盖基类的抽象方法也可以不覆盖,如果不覆盖,则其派生类必须覆盖它们。
二、接口:
接口是引用类型的,类似于类
,
和抽象类的相似之处有三点:
1
、不能实例化;
2
、包含未实现的方法声明;
3
、
派生类必须实现未实现的方法
——抽象类是抽象方法,接口则是所有成员(不仅是方法包括其他成员);
另外,接口有如下特性:
接口除了可以包含方法之外,还可以包含属性、索引器、事件
,而且这些成员都被定义为
公有
的。除此之外,不能包含任何其他的成员,例如:常量、域、构造函数、析构函数、静态成员。
C#
中一个类可以直接继承多个接口,但只能直接继承一个类(包括抽象类)。
三、抽象类和接口的区别:
1.
类是对对象的抽象,
可以把抽象类理解为把类当作对象
,抽象成的类叫做抽象类
.
而接口只是一个行为的规范或规定
,微软的自定义接口总是后带
able
字段,证明其是表述一类类
“
我能做。。。
”.
抽象类更多的是定义在一系列紧密相关的类间,而接口大多数是关系疏松但都实现某一功能的类中
。
2.
接口基本上不具备继承的任何具体特点
,
它仅仅承诺了能够调用的方法
;
3.
一个类一次可以实现若干个接口
,
但是只能扩展一个父类
。
4.
接口可以用于支持回调
,
而继承并不具备这个特点
。
5.
抽象类不能被密封。
6.
抽象类实现的具体方法默认为虚的,但实现接口的类中的接口方法却默认为非虚的,当然您也可以声明为虚的
.
7.
(接口)与非抽象类类似,抽象类也必须为在该类的基类列表中列出的接口的所有成员提供它自己的实现。但是,允许抽象类将接口方法映射到抽象方法上。
8.
抽象类实现了
OOP
中的一个原则,把可变的与不可变的分离。抽象类和接口就是定义为不可变的,而把可变的作为子类去实现。
9.
好的接口定义应该是具有专一功能性的
,而不是多功能的,否则造成接口污染。如果一个类只是实现了这个接口的中一个功能,而不得不去实现接口中的其他方法,就叫接口污染。
10.
尽量避免使用继承来实现组建功能,而是使用黑箱复用,即对象组合。因为继承的层次增多,造成最直接的后果就是当你调用这个类群中某一类,就必须把他们全部加载到栈中!后果可想而知
.
(结合堆栈原理理解)。同时,有心的朋友可以留意到微软在构建一个类时,很多时候用到了对象组合的方法。比如
asp.net
中,
Page
类,有
Server Request
等属性,但其实他们都是某个类的对象。使用
Page
类的这个对象来调用另外的类的方法和属性,这个是非常基本的一个设计原则。
11.
如果抽象类实现接口,则可以把接口中方法映射到抽象类中作为抽象方法而不必实现,而在抽象类的子类中实现接口中方法。
四、抽象类和接口的使用:
1.
如果预计要创建组件的多个版本,则创建抽象类。抽象类提供简单的方法来控制组件版本。
2.
如果创建的功能将在大范围的全异对象间使用,则使用接口。如果要设计小而简练的功能块,则使用接口。
3.
如果要设计大的功能单元,则使用抽象类;如果要在组件的所有实现间提供通用的已实现功能,则使用抽象类。
4.
抽象类主要用于关系密切的对象;而接口适合为不相关的类提供通用功能。
五:两者的简单对比表格:
接口
抽象类
多继承
支持
不支持
类型限制
没有
有,只能是引用类型
方法实现
继承类型中必须给出方法实现
继承类中可以不给出
扩展性
比较麻烦
相对比较灵活
多层继承
比较麻烦,需要借助虚函数
比较灵活
作者:
MaoBisheng
出处:
http://maobisheng.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
绿色通道:
好文要顶
关注我
收藏该文
与我联系
posted on 2008-09-24 19:22
MaoBisheng
阅读(401)
评论(2)
编辑
收藏
评论
1683227
#1楼
2009-01-05 15:05
小贱
豁然开朗
回复
引用
查看
#2楼
2009-10-27 16:40
code 民工
谢谢了!我转过去了
回复
引用
查看
注册用户登录后才能发表评论,请
登录
或
注册
,
返回博客园首页
。
首页
博问
闪存
新闻
园子
招聘
知识库
最新IT新闻
:
·
春节后礼品回收iPhone成新宠燕窝被冷落
·
分析称苹果近1000亿现金储备最佳用途是派息
·
扎克伯格11件蠢事:曾同意将Facebook卖给雅虎
·
最想要的Entity Framework功能
·
专访Jeffrey Richter:Windows 8是微软的重中之重
»
更多新闻...
最新知识库文章
:
·
高级编程语言的发展历程
·
如何学习一门新的编程语言?
·
学习不同编程语言的重要性
·
为什么我喜欢富于表达性的编程语言
·
计算机专业的女生为什么要学编程
»
更多知识库文章...
China-pub 2011秋季教材巡展
China-Pub 计算机绝版图书按需印刷服务
<
2009年1月
>
日
一
二
三
四
五
六
28
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
7
公告
昵称:
MaoBisheng
园龄:
3年6个月
粉丝:
8
关注:
6
常用链接
我的随笔
我的评论
我的参与
最新评论
我的标签
最新随笔
1. new与override区别
2. 水晶报表错误:bobj is not defined
3. SQL生成唯一ID号解决方案
4. 水晶报表文本框内文字过长溢出问题
5. 水晶报表导出中文字符乱码
6. 利用水晶报表实现Web打印
7. VS2010 Add Web Reference与Add Service Reference区别
8. VS2010 Debugger --The source file is different from when the module was built
9. 利用反射实现WSDL实体与自定义实体之间的转换
10. 使用“性能监视器”监视系统性能/运行情况
我的标签
水晶报表
(4)
Bat
(2)
LogParser
(2)
日志分析
(2)
SQL
(2)
分布式计算
(1)
盛大
(1)
创新院
(1)
技术
(1)
会议
(1)
更多
随笔分类
(79)
ASP.NET(3)
(rss)
C#技术(18)
(rss)
Crystal Report(4)
(rss)
DataBase-Oracle(1)
(rss)
DataBase-SQL(6)
(rss)
Essay(9)
(rss)
Javascript
(rss)
VB(1)
(rss)
Web开发(1)
(rss)
操作系统(3)
(rss)
架构设计(3)
(rss)
设计模式(29)
(rss)
试题(1)
(rss)
数据结构与算法
(rss)
随笔档案
(74)
2011年12月 (1)
2011年8月 (4)
2011年7月 (1)
2011年6月 (2)
2011年5月 (1)
2010年7月 (2)
2010年6月 (1)
2010年5月 (3)
2010年3月 (2)
2010年2月 (1)
2009年9月 (1)
2009年6月 (1)
2009年5月 (1)
2009年4月 (1)
2009年3月 (1)
2009年2月 (1)
2008年12月 (2)
2008年11月 (2)
2008年10月 (1)
2008年9月 (13)
2008年8月 (16)
2008年7月 (16)
积分与排名
积分 - 32747
排名 - 3258
最新评论
评论排行榜
推荐排行榜