C#抽象类与接口的区别

抽象类:

(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. 就像铁门木门都是门(抽象类),你想要个门我给不了(不能实例化),但我可以给你个具体的铁门或木门(多态);而且只能是门,你不能说它是窗(单继承),一个门可以有锁(接口)也可以有门铃(多实现)。门(抽象类)定义了你是什么,接口(锁)规定了你能做什么(一个接口最好只能做一件事,你不能要求锁也能发出声音吧(接口污染))。

抽象类定义是什么,接口规定能做什么。

你可能感兴趣的:(C#抽象类与接口的区别)