如果默认接口方法是在C#8.0中实现的,那么我为什么需要抽象类呢?

如果默认接口方法是在C#8.0中实现的,那么我为什么需要抽象类呢?,c#,c#-8.0,default-interface-member,C#,C# 8.0,Default Interface Member,我最近遇到了一个正在考虑在下一个C#版本中添加的特性列表。其中一种称为“默认接口方法”: 简而言之,它将允许您在接口本身上定义实际的方法实现,这意味着接口现在可以有实现。既然如此,C#类可以实现/继承多个接口,那么我究竟为什么要使用抽象类呢 我唯一想到的是接口不能有构造函数,所以可能需要在抽象类构造函数中运行一些逻辑,这将证明定义抽象类是正确的 还有其他任何人可以想到的场景吗?通常类继承感觉像是一种分类法(x'是'y'),而接口是行为(x'可以'y'),因此在隐含的意义上有细微的区别。虽然你是

我最近遇到了一个正在考虑在下一个C#版本中添加的特性列表。其中一种称为“默认接口方法”:

简而言之,它将允许您在接口本身上定义实际的方法实现,这意味着接口现在可以有实现。既然如此,C#类可以实现/继承多个接口,那么我究竟为什么要使用抽象类呢

我唯一想到的是接口不能有构造函数,所以可能需要在抽象类构造函数中运行一些逻辑,这将证明定义抽象类是正确的


还有其他任何人可以想到的场景吗?

通常类继承感觉像是一种分类法(x'是'y'),而接口是行为(x'可以'y'),因此在隐含的意义上有细微的区别。虽然你是对的,技术上的区别不那么明确。

除了评论中提到的状态

基类


不能从基类继承接口。接口只能继承一个接口。您需要从其他类派生抽象类。由于不能从类继承,所以不能重写类方法。您可以在抽象类中重写它。

抽象类可以具有状态。尝试使用默认接口方法执行状态将是一件痛苦的事情。这与为自C#3.0以来就存在的接口编写扩展方法的能力没有多大区别。从那时起,您必须创建抽象类的任何原因都将仍然存在。@Servy特定接口实现者是否可以覆盖扩展方法以提供更高效的实现?@PetSerAl不是通过虚拟分派。它们可以是静态的。如果您希望不同的实现提供自己的实现,那么它属于接口本身。在该功能的链接中,在“静态和私有方法”部分下,它们指定允许接口声明私有方法:“因为接口现在可能包含可执行代码,所以将公共代码抽象为私有和静态方法非常有用。我们现在允许在接口中使用这些特性。”许多新的C#特性往往会使行变得模糊。例如,
GetValue(){return x;}
Value{get{return x;}}
似乎不太相似,但在表达式体中,
GetValue()=>x;
Value=>x;
。突然之间,唯一的区别似乎是
GetValue()
必须使用单词
Get
,因为它是一个函数,需要一个动词,还必须使用括号,但除此之外,它们或多或少是一样的。