接口 VS 抽象类
A. 相似之处
1、不能实例化;
2、包含未实现的方法声明;
3、派生类必须实现未实现的方法,抽象类是抽象方法,接口则是所有成员(不仅是方法包括其他成员);
4、在接口中增加一个成员,在抽象类中增加一个抽象方法,所有的继承了接口/抽象类的子类都必须实现这个成员/抽象方法;
5、抽象类A可以继承抽象类B,接口C可以继承接口D。
6、都可继承多个接口
B. 不同之处
1、接口定义类的公共行为,抽象类定义类的公共实现;
2、一个类只能继承自一个类(抽象类),但是可以同时实现多个接口;抽象类一般用于实现单继承,接口一般用于实现多继承;
3、抽象类中可以包含的成员类型,只有方法、属性、索引器、事件可以被接口所包含;
4、可以为抽象类中的成员添加“访问修饰符”,接口中的成员不能;
5、接口中不能有实现,抽象类中可以有未实现成员也可以有实现的成员;
6、接口中未实现的成员必须在子类中实现,抽象类中未实现的方法必须在子类中重写;
7、如果在接口中增加一个成员,所有实现这个接口的类都必须实现这一成员,如果有很多个类继承了这个接口,就会增大工作量。如果在抽象类中增加一个可供子类继承,且不需要在子类中重写的东西(如,一个属性、一个函数),那么它所有的派生类都可以直接使用这个东西。
8、抽象类A可以继承抽象类B,接口不能继承类,更不要说抽象类了。
9、 接口可以继承多个接口,多重继承;而一个抽象类只能继承一个父类,且这个父类必须是抽象类。