在C#里面,类是不可以多重继承的,但是接口是可以的,
在类声明中使用 abstract 修饰符的类称为抽象类,abstract 修饰符用于表示所修饰的类是不完整的,并且它只能用作基类
微软的说法
抽象类具有以下特性:

  • 抽象类不能实例化。
  • 抽象类可以包含抽象方法和抽象访问器。
  • 不能用 sealed 修饰符修改抽象类,这意味着该类不能被继承。
  • 从抽象类派生的非抽象类必须包括继承的所有抽象方法和抽象访问器的实实现。

而一个接口定义一个协定,一个接口可从一个或多个基接口继承,
区别:
抽象類:
a.包含一個或多個抽象方法或屬性的類必須定義為抽象類
 b.繼承抽象類的派生類必須實現抽象類的所有抽象方法或
         屬性,否則該派生類也必是抽象類,至到完全實現為止.
       c.抽象類必須是公共的(public).
       d.抽象類不存在對象實例,但可以申明引用變量.另外抽象類
         中可以有非抽象方法,供派生類調用.
接口:1.接口中定義抽象的方法,屬性,索引,事件
     2.接口必須由類來實現,故其只能是默認public的,不可顯式申明,不能申明為
      static
     3.實現接口的類必須完全實現接口中的所有的方法屬性,索引,事件,不能只實現一部分
     4.一個類只能繼承一個基類,但可以實現多個接口,其中繼承的基類必須放在最
       前面,然后是接口,它們用逗號分開.
使用:
如果预计要创建组件的多个版本,则创建抽象类。抽象类提供简单易行的方法来控制组件版本。通过更新基类,所有继承类都随更改自动更新。另一方面,接口一旦创建就不能更改。如果需要接口的新版本,必须创建一个全新的接口。
如果创建的功能将在大范围的全异对象间使用,则使用接口。抽象类应主要用于关系密切的对象,而接口最适合为不相关的类提供通用功能。
如果要设计小而简练的功能块,则使用接口。如果要设计大的功能单元,则使用抽象类。
如果要在组件的所有实现间提供通用的已实现功能,则使用抽象类。抽象类允许部分实现类,而接口不包含任何成员的实现。