抽象类:
(1)不能被实例化;
(2)抽象方法只能声明于抽象类中,且不能有实现,有抽象方法的必定为抽象类;
(3)抽象类可派生自抽象类且可不覆盖其抽象方法,但抽象方法必须在具体派生类中全部重写;
(4)可以包含普通方法;
接口:
(1)不能被实例化;
(2)接口可以包含未实现的方法、属性、索引器、事件,所有这些成员默认是公有的,无public,无abstract;
(3)不能包含常量、字段(域)、构造函数、析构函数、静态成员;
(4)派生类必须实现接口的所有成员;
(5)不能包含普通方法;
(6)支持回调;
相同:
(1)二者均不能实例化;
(2)二者都可被子类继承;
(3)二者具体派生类均需实现所有抽象成员(未实现的成员);
区别:
(1)抽象类只能被单一继承,接口可以被多重实现;
(2)接口支持回调,抽象类不行;
(3)抽象类能包含普通方法,接口不能;
(4)抽象类成员必须使用public修饰,接口成员默认public且不能用abstract 、override修饰;
(5)抽象类可以包含字段、属性、方法,接口只能包含属性,方法,索引器,事件,不能包含字段,构造函数、析构函数和静态成员或常量;
使用:
1. 如果预计要创建组件的多个版本,则创建抽象类。抽象类提供简单的方法来控制组件版本;
2.如果创建的功能将在大范围的全异对象间使用,则使用接口。如果要设计小而简练的功能块,则使用接口;
3.如果要设计大的功能单元,则使用抽象类。如果要在组件的所有实现间提供通用的已实现功能,则使用抽象类;
4.抽象类主要用于关系密切的对象;而接口适合为不相关的类提供通用功能。
综上:
(1) 好的接口定义应该是具有专一功能性的,而不是多功能的,否则造成接口污染。如果一个类只是实现了这个接口的中一个功能,而不得不去实现接口中的其他方法,就叫接口污染;
(2)比喻:
1.飞机会飞,鸟会飞,他们都继承了同一个接口“飞”;但是F22属于飞机抽象类,鸽子属于鸟抽象类;
2. 就像铁门木门都是门(抽象类),你想要个门我给不了(不能实例化),但我可以给你个具体的铁门或木门(多态);而且只能是门,你不能说它是窗(单继承),一个门可以有锁(接口)也可以有门铃(多实现)。门(抽象类)定义了你是什么,接口(锁)规定了你能做什么(一个接口最好只能做一件事,你不能要求锁也能发出声音吧(接口污染))。