2017-08-11 55 views
2

我最近遇到了下一个版本的C#中正在考虑添加的功能列表。其中之一是所谓的“默认的接口方法”:如果在C#8.0中实现默认接口方法,为什么我需要抽象类?

https://github.com/dotnet/csharplang/blob/master/proposals/default-interface-methods.md

总之,它可以让你对接口本身含义接口现在可以实现定义了实际的方法实现。既然是这样,并且C#类可以从多个接口实现/继承,那么为什么我会使用抽象类?

唯一让我想到的是接口不能有构造函数,所以也许需要在抽象类构造函数中运行一些逻辑,这将证明定义一个抽象类是合理的。

是否有任何人可以想到的其他场景?

+4

抽象类可以有状态。试图用默认的接口方法来执行状态会很痛苦。 – willaien

+0

这与从C#3.0开始编写接口的扩展方法的能力没有多大区别。从那时起,你曾经不得不创建一个抽象类的任何原因仍然存在。 – Servy

+0

@Servy可以通过特定的接口实现者重写扩展方法来提供更高效的实现吗? – PetSerAl

回答

0

通常,类继承感觉就像是一个分类(x'是'y),而接口是行为(x'can do'y),所以隐含意义上有细微差别。虽然你说得对,但技术上的区别并不太清楚。

0

除了状态在评论中提到的,

Base Class

不能继承基类的接口。接口只能继承一个接口。你需要抽象类来从其他类中派生。既然你不能从类继承,你不能重写类的方法。你可以在抽象类中重写。

+1

在该功能的链接中,在“静态和私有方法”部分中,它们指定它们将允许接口声明私有方法:“由于接口现在可能包含可执行代码,因此将常见代码抽象为私有和静态方法,我们现在允许这些接口。“ – Marko

相关问题