关于抽象类与接口的选择
Posted winhec
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于抽象类与接口的选择相关的知识,希望对你有一定的参考价值。
- 如果准备为不相关的类创建一些提供共有功能的东西,请使用接口。
- 抽象类允许你为子类提供默认功能。
- 如果要为层次结构中密切相关的对象创建内容,请使用抽象类。
- 如果基类经常更改并且使用了接口替代了抽象类,那么我们将遇到问题。一旦接口更改,所有实现该接口的类都将被破坏。如果你现在只在项目中使用它们,那么问题不大。然而一旦发布到客户端,这些接口就应该被锁定。否则那时你将破坏客户端的代码。
- 相比接口,抽象类可以有实现。没有实现的抽象类跟接口没什么区别。但是C#允许实现你继承、实现多个接口,但是只允许继承一个基类。
- 接口一旦部署即冻结,你不得更改已部署的接口。如果更改接口那将破坏二进制兼容性,但是只要你不更改方法签名就可以扩展抽象类。
- 接口中方法的签名只能是public,而抽象类中抽象方法可以有public、 protected 、internal、或者protected internal几种访问级别。
使用抽象方法
当创建一个将广泛分发或重用的类库时(尤其是客户端),使用优先于接口的抽象类。因为这能简化版本控制。这是微软团队开发基础类库时的惯例(COM除外,因为COM是围绕接口设计的)。
使用抽象类为类型家族定义共同的基类。
使用抽象类提供默认的行为。
子类只是类逻辑上属于的层次结构中的基类。
使用接口
当创建一个可以被随意更改的独立项目时,使用优先于抽象类的接口,因为它提供更多的设计灵活性。
使用接口来引入多态行为而无需子类化并模拟多重继承 - 允许特定类型支持多种行为。
使用接口为值类型设计多态层次结构。
当真正的意图是协议永远不变,那么使用接口。
设计良好的接口定义了一个特定的功能范围,拆分不包含相关功能的接口。
以上是关于关于抽象类与接口的选择的主要内容,如果未能解决你的问题,请参考以下文章