抽象类和接口一般不容易区分,个人觉得接口比抽象类更加抽象。
抽象类用来列举一个类所需要的行为但不明确提供每个行为的具体实现方法。
当从抽象基类派生一个类时,派生类将继承基类所有的特性,它可以通过 override关键字用具体版本替换继承下来的抽象方法。
如果该派生类没有从抽象基类继承下来的所有抽象方法提供具体实现,那么该派生类也是抽象类。
实现一个接口,概念上类似在扩充一个抽象类时填充其抽象方法,而两者的区别是:
1.对于接口我们只抽象行为,而抽象类经常会包含具体的attribute,以及一些抽象行为和具体行为。
从某种程度来讲,接口要比抽象类更为抽象,因为接口留下了更多的想象空间(抽象是从众多的事物中抽取出共同的、本质性的特征,而舍弃其非本质的特征。例如苹果、香蕉、生梨、葡萄、桃子等,它们共同的特性就是水果。得出水果概念的过程,就是一个抽象的过程。要抽象,就必须进行比较,没有比较就无法找到共同的部分。)
2.当从一个抽象类派生一个非抽象类时,派生类通过覆载手段,提供抽象方法具体实现,其方法头一定会包括override关键字。当一个类实现一个接口时,必须提供接口中声明的所有方法的具体实现。实现类并不覆载他们。
3.抽象类不一定要覆载基类的所有抽象方法,如果有一个或多个抽象方法没有覆载那么该派生类也是一个抽象方法。
4.一个类只能从一个基类派生,而一个类可以实现多个接口,同时接口可以作为数据类型返回。
从语法上看两者的区别为:
1.抽象类可能会声明数据结构(attribute),而接口不声明attribtute.
2.抽象类使用关键字abstract声明抽象方法,并添加其可访问性,而接口不能加Public或者Abstract关键字,而使用interface。
3.抽象类可能会声明具体方法,而接口不声明具体方法。
4.基类从抽象类继承所有的attribute,而且可以添加本身的attribute。而基类实现接口的时候必须提供自己的attribute,而接口无法提供。(例如继承来的变量,抽象类提供,而接口无法提供)
5.基类可以覆载从抽象类继承的抽象方法,而基类必须全部实现接口的方法,无需使用override关键字。
转自:http://www.cnblogs.com/herbert/archive/2010/03/10/1682675.html