1. 如果准备为不相关的类创建一些提供共有功能的东西,请使用接口。
  2. 抽象类允许你为子类提供默认功能。
  3. 如果要为层次结构中密切相关的对象创建内容,请使用抽象类。
  4. 如果基类经常更改并且使用了接口替代了抽象类,那么我们将遇到问题。一旦接口更改,所有实现该接口的类都将被破坏。如果你现在只在项目中使用它们,那么问题不大。然而一旦发布到客户端,这些接口就应该被锁定。否则那时你将破坏客户端的代码。
  5. 相比接口,抽象类可以有实现。没有实现的抽象类跟接口没什么区别。但是C#允许实现你继承、实现多个接口,但是只允许继承一个基类。
  6. 接口一旦部署即冻结,你不得更改已部署的接口。如果更改接口那将破坏二进制兼容性,但是只要你不更改方法签名就可以扩展抽象类。
  7. 接口中方法的签名只能是public,而抽象类中抽象方法可以有public、 protected 、internal、或者protected internal几种访问级别。

使用抽象方法

当创建一个将广泛分发或重用的类库时(尤其是客户端),使用优先于接口的抽象类。因为这能简化版本控制。这是微软团队开发基础类库时的惯例(COM除外,因为COM是围绕接口设计的)。

使用抽象类为类型家族定义共同的基类。

使用抽象类提供默认的行为。

子类只是类逻辑上属于的层次结构中的基类。

使用接口

当创建一个可以被随意更改的独立项目时,使用优先于抽象类的接口,因为它提供更多的设计灵活性。

使用接口来引入多态行为而无需子类化并模拟多重继承 - 允许特定类型支持多种行为。

使用接口为值类型设计多态层次结构。

当真正的意图是协议永远不变,那么使用接口。

设计良好的接口定义了一个特定的功能范围,拆分不包含相关功能的接口。