在C#中,何时应该使用接口,何时应该使用抽象类?可以决定因素是什么?
更新:C# 8.0 新特性: 从 C# 8.0 开始,接口可以为成员(包括属性)定义默认实现。在接口中为属性定义默认实现很少见,因为接口可能不定义实例数据字段。
抽象类的优点是:
接口仅仅是数据传递的契约,并且没有这些功能。然而,它们通常更灵活,因为一个类型只能派生自一个类,但可以实现任意数量的接口。
抽象类和接口在语义上是不同的,尽管它们的用法可能有重叠。
抽象类通常被用作相似类的构建基础。适用于这些类的共同实现可以在抽象类中体现。
接口通常用于指定类的能力,这些类不必非常相似。
另一个需要考虑的问题是,由于没有多重继承,如果想让一个类实现/继承你的接口/抽象类,但又要继承另一个基类,那么就应该使用接口。
真正的问题是:使用接口还是基类。这个问题以前已经讨论过。
在C#中,抽象类(用"abstract"关键字标记的类)仅仅是一个不能实例化对象的类。这与仅仅区分基类和接口的目的不同。