您的位置:首页 > 其它

接口与抽象类的终极区别

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) ; 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: