接口与抽象类的终极区别
2016-01-08 23:51
274 查看
接口与抽象类都是用来将一系列东西抽象出来的,或者说是用来定义某类东西的。
但他们的使用是有区别的。
区别在于,他们定义某类东西的时候,是将动作集还是数据集抽象出来。
只需要将动作集抽象出来就能定义为一类东西的话,就用接口。
只需要/还需要将数据集抽象出来才能定义为一类东西的话,就用抽象类。
PS:数据集不是指 Set,是指一个或者多个数据,可以是属性、成员……等可用于储存数据的对象。
所以有以下结论:
一、接口是抽象类的一个(动作)子集。
二、接口的作用在于,定义某类东西只需要将动作集抽象出来就可以完整定义。
比如,集合接口(ICollection),集合只需要将动作集抽象出来就可以说明这个对象是个集合,而集合对象内部封装的是什么数据(理论上)都可以。只要该对象具有迭代、移动、增加、删除……这些动作就是一个集合,完全可以封装一个 string 为集合对象,只要能够实现(Icollection)的动作,比如可以用“|”做分隔符,分隔子元素,然后实现迭代、移动、增加……,只是很蛋疼而已。
三、抽象类的作用在于,定义某类东西必须将数据集抽象出来才能完整定义,并不一定须要将动作集抽象出来,或者定义某一类东西只是为了意义上的区分,而不是为了定义。
比如,数据流基类(Stream),对于一个数据流来说,无法只将动作集抽象出来就能完整定义一个对象是不是数据流,也无法说明该对象含有某些数据就是数据流对象(无法将数据集抽象出来),但仍然需要在意义上进行区分,所以就定义为数据流。
又比如,数据库命令基类(DbCommand),对于这样一个定义,只将动作集抽象出来是不够的,必须要将数据集抽象出来才能完成定义,比如连接对象、事务对象……,所以就须要定义为抽象类。
其实还有要注意的就是。
接口与抽象类,并不是因为接口或者抽象类的限制,才衍生出上面的使用方法。
而是发明面向对象的人,有以上的需求,才去发明接口与抽象类的。所以大家思考的时候,不应该从上而下,而应该从下而上。
那么也可以调用上面多态方法,所以说接口使方法具有较好扩展性.
如果继承它的类很多的话,有多少好处是可想而知的!
另外, 也有抽象类能够实现但接口不能实现的情况:
1. 在抽象类中可以加代码逻辑,但接口不能.
2. 如果要在接口中增加一个方法, 所有实现它的类都强制重载一遍此方法, 如果重载类很多时, 会增大工作量.
总之, 一般在仅实现单继承用途时, 尽量用抽象类, 功能也更强些!
C#接口可以从多个基接口继承,而类或结构可以实现多个接口。C#接口可以包含方法、属性、事件和索引器。接口本身不提供它所定义的成员的实现。接口只指定实现该接口的类或接口必须提供的成员。
C#接口好比一种模版,这种模版定义了对象必须实现的方法,其目的就是让这些方法可以作为接口实例被引用。接口不能被实例化。类可以实现多个接口并且通过这些实现的接口被索引。接口变量只能索引实现该接口的类的实例。例子:
interface IMyExample
{
string this[int index] { get ; set ; }
event EventHandler Even ;
void Find(int value) ;
string Point { get ; set ; }
}
public delegate void EventHandler(object sender, Event e) ;
但他们的使用是有区别的。
区别在于,他们定义某类东西的时候,是将动作集还是数据集抽象出来。
只需要将动作集抽象出来就能定义为一类东西的话,就用接口。
只需要/还需要将数据集抽象出来才能定义为一类东西的话,就用抽象类。
PS:数据集不是指 Set,是指一个或者多个数据,可以是属性、成员……等可用于储存数据的对象。
所以有以下结论:
一、接口是抽象类的一个(动作)子集。
二、接口的作用在于,定义某类东西只需要将动作集抽象出来就可以完整定义。
比如,集合接口(ICollection),集合只需要将动作集抽象出来就可以说明这个对象是个集合,而集合对象内部封装的是什么数据(理论上)都可以。只要该对象具有迭代、移动、增加、删除……这些动作就是一个集合,完全可以封装一个 string 为集合对象,只要能够实现(Icollection)的动作,比如可以用“|”做分隔符,分隔子元素,然后实现迭代、移动、增加……,只是很蛋疼而已。
三、抽象类的作用在于,定义某类东西必须将数据集抽象出来才能完整定义,并不一定须要将动作集抽象出来,或者定义某一类东西只是为了意义上的区分,而不是为了定义。
比如,数据流基类(Stream),对于一个数据流来说,无法只将动作集抽象出来就能完整定义一个对象是不是数据流,也无法说明该对象含有某些数据就是数据流对象(无法将数据集抽象出来),但仍然需要在意义上进行区分,所以就定义为数据流。
又比如,数据库命令基类(DbCommand),对于这样一个定义,只将动作集抽象出来是不够的,必须要将数据集抽象出来才能完成定义,比如连接对象、事务对象……,所以就须要定义为抽象类。
其实还有要注意的就是。
接口与抽象类,并不是因为接口或者抽象类的限制,才衍生出上面的使用方法。
而是发明面向对象的人,有以上的需求,才去发明接口与抽象类的。所以大家思考的时候,不应该从上而下,而应该从下而上。
那么也可以调用上面多态方法,所以说接口使方法具有较好扩展性.
如果继承它的类很多的话,有多少好处是可想而知的!
另外, 也有抽象类能够实现但接口不能实现的情况:
1. 在抽象类中可以加代码逻辑,但接口不能.
2. 如果要在接口中增加一个方法, 所有实现它的类都强制重载一遍此方法, 如果重载类很多时, 会增大工作量.
总之, 一般在仅实现单继承用途时, 尽量用抽象类, 功能也更强些!
C#接口可以从多个基接口继承,而类或结构可以实现多个接口。C#接口可以包含方法、属性、事件和索引器。接口本身不提供它所定义的成员的实现。接口只指定实现该接口的类或接口必须提供的成员。
C#接口好比一种模版,这种模版定义了对象必须实现的方法,其目的就是让这些方法可以作为接口实例被引用。接口不能被实例化。类可以实现多个接口并且通过这些实现的接口被索引。接口变量只能索引实现该接口的类的实例。例子:
interface IMyExample
{
string this[int index] { get ; set ; }
event EventHandler Even ;
void Find(int value) ;
string Point { get ; set ; }
}
public delegate void EventHandler(object sender, Event e) ;
相关文章推荐
- 【视频】Excel2013十大企业级明星函数视频课程【精讲】
- c#中绝对路径和相对路径
- BootStrap modal() 如何根据返回的HTML宽度自动调整宽度?
- 爱护你的眼睛请使用f.lux
- 理解Android虚拟机体系结构
- 如何搭建一个自己的网络验证系统?
- Adaboost的几个人脸检测网站
- caffe深度学习系列2015年12月
- Oracle Linux 教程 by 冰琉璃
- ListView下拉刷新
- JAVA中实现链式操作(方法链)的简单例子
- myeclipse导出可执行jar包读取外部配置文件
- 多益网址——开发者专用
- skyline代码搬迁后3d控件出错
- 关于智能时代革命性产品的构想--虚拟机器人
- hihoCoder 1239 Fibonacci
- iOS UITableView(十一) tableView的下拉刷新
- 【javaMail】【2.发HTML邮件】java mail 发送HTML邮件
- Apose.word控件获取书签中的内容并复制到一个新的word文档中
- 配置httpclient使用logback