首页 > 代码库 > 接口与抽象类的终极区别

接口与抽象类的终极区别

接口与抽象类都是用来将一系列东西抽象出来的,或者说是用来定义某类东西的。

但他们的使用是有区别的。

区别在于,他们定义某类东西的时候,是将动作集还是数据集抽象出来。

只需要将动作集抽象出来就能定义为一类东西的话,就用接口。

只需要/还需要将数据集抽象出来才能定义为一类东西的话,就用抽象类。

PS:数据集不是指 Set,是指一个或者多个数据,可以是属性、成员……等可用于储存数据的对象。

 

所以有以下结论:

一、接口是抽象类的一个(动作)子集。

二、接口的作用在于,定义某类东西只需要将动作集抽象出来就可以完整定义。

  比如,集合接口(ICollection),集合只需要将动作集抽象出来就可以说明这个对象是个集合,而集合对象内部封装的是什么数据(理论上)都可以。只要该对象具有迭代、移动、增加、删除……这些动作就是一个集合,完全可以封装一个 string 为集合对象,只要能够实现(Icollection)的动作,比如可以用“|”做分隔符,分隔子元素,然后实现迭代、移动、增加……,只是很蛋疼而已。

三、抽象类的作用在于,定义某类东西必须将数据集抽象出来才能完整定义,并不一定须要将动作集抽象出来,或者定义某一类东西只是为了意义上的区分,而不是为了定义

  比如,数据流基类(Stream),对于一个数据流来说,无法只将动作集抽象出来就能完整定义一个对象是不是数据流,也无法说明该对象含有某些数据就是数据流对象(无法将数据集抽象出来),但仍然需要在意义上进行区分,所以就定义为数据流。

  又比如,数据库命令基类(DbCommand),对于这样一个定义,只将动作集抽象出来是不够的,必须要将数据集抽象出来才能完成定义,比如连接对象、事务对象……,所以就须要定义为抽象类。

 

其实还有要注意的就是。

接口与抽象类,并不是因为接口或者抽象类的限制,才衍生出上面的使用方法。

而是发明面向对象的人,有以上的需求,才去发明接口与抽象类的。所以大家思考的时候,不应该从上而下,而应该从下而上。

接口与抽象类的终极区别