《大话设计模式》P.357
从表象来说:
1、抽象类可以给出一些成员(非抽象成员)的实现,接口却不包含成员的实现(没有方法体);
2、抽象类的抽象成员可被子类部分实现,接口的成员需要实现类完全实现;
3、一个类只能继承一个抽象类,但可以实现多个接口。
区分抽象类和接口的三点:
1、类是对对象的抽象;抽象类是对类的抽象;接口是对行为的抽象。
2、如果行为跨越不同类的对象,可使用接口;对于一些相似的类对象,用继承抽象类。
3、从设计角度讲,抽象类是从子类中发现了公共的东西,泛化初父类,然后子类继承父类;而接口是根本不知子类的存在,方法实现还不确认,预先定义。
抽象类是自底而上抽象出来的,而接口则是自顶向下设计出来的。
《C# 入门经典》P.182
类似之处:
1、抽象类和接口都包含可以由派生类继承的成员;
2、抽象类和接口都不能直接实例化,但可以声明它们的变量。
不同之处:
1、一个类只能继承一个抽象类,但可以实现多个接口;
2、抽象类可以有抽象成员(没有代码体,且必须在派生类中实现,否则派生类本身也是抽象的)和非抽象成员(它们拥有代码体,也可以是虚拟的,这样就可以在派生类中重写);
3、接口成员必须都在使用接口的类上实现——它们没有代码体;
4、接口成员是公共的,但抽象类的成员可以是私有的(只要它们不是抽象的)、受保护的、内部的或受保护的内部成员;
5、接口不能包含字段、构造函数、析构函数、静态成员或常量。