C#允许对接口类执行与Java8相同的操作吗

C#允许对接口类执行与Java8相同的操作吗,java,c#,interface,Java,C#,Interface,发件人: 我已经用Java编程超过16年了,教它的时间将近一半。因此,需要一点练习来停止重复这句话:“接口可能只包含公共和抽象的方法。”从Java8开始,这句话就不再正确了。现在可以向Java接口添加实例和静态方法 新的C#版本是否也允许这样做,或者在未来会这样做 我一直觉得界面在理论上是好的,但在实践中,正如本文所描述的那样,会给界面使用者带来许多维护噩梦 更新:批评家们也对我感兴趣,如果你读过作者的文章,尤其是关于抽象类替代方案不能解决现实世界的问题的文章,你会更感兴趣。确定实现的方法或属性

发件人:

我已经用Java编程超过16年了,教它的时间将近一半。因此,需要一点练习来停止重复这句话:“接口可能只包含公共和抽象的方法。”从Java8开始,这句话就不再正确了。现在可以向Java接口添加实例和静态方法

新的C#版本是否也允许这样做,或者在未来会这样做

我一直觉得界面在理论上是好的,但在实践中,正如本文所描述的那样,会给界面使用者带来许多维护噩梦


更新:批评家们也对我感兴趣,如果你读过作者的文章,尤其是关于抽象类替代方案不能解决现实世界的问题的文章,你会更感兴趣。

确定实现的方法或属性的范围是由C#中的实现类决定的。C#知道,这有助于设置方法的范围。(您可以创建具有所需范围的辅助方法或属性(
内部
私有
受保护

静态接口方法在C#中是不可能的,我想知道你为什么想要这样。静态方法绑定到类型而不是实例,因此你不能调用
这个。例如,StaticMethod
。这使得在接口上定义它们毫无用处


而默认方法只是…可怕。做一个
抽象的
类。句号。

对我来说,这些“改进”听起来很糟糕。接口中的默认方法?你在开玩笑吗?如果你有一些基本的通用逻辑,用
virtual
method定义一个抽象类。接口是一个很好的工具,有助于分离定义和实现。“默认”方法绝对不遵循这个逻辑。@YeldarKurmangaliyev在我看到它如何在实际中使用之前,我不会把它一笔勾销。我相信他们添加它的主要原因是在他们的集合中支持Lambda扩展,而C#已经用扩展方法很好地解决了这一问题,我认为我们不需要另一种方法g在C#中已经有了可能的东西,但我们必须看看除了为现有的东西添加扩展之外,人们是否还能想出一些巧妙的东西来让它变得有意义。@YeldarKurmangaliyev我希望Java设计者有一些基本的通用逻辑;)这已经没有什么功能要求了,你能准确地反驳作者的论点吗?接口中的静态方法允许你将实用方法放在适当的位置,例如,
Comparator.comparingBy
。我也不是100%相信接口中的默认方法,但我个人认为,对于如何在不破坏现有代码的情况下改进接口的问题,这是一个比C#扩展方法更好的解决方案。我不认为扩展方法可以解决不断改进的接口问题。还有其他方法可以解决这些问题。在我看来,不能依靠编译器来告诉我要实现什么更糟糕。@PaulBoddington
default
如果一个方法依赖另一个方法,那么方法是有用的。例如,您可能有一个接口
Comparable
,该接口提供两种方法:
int compareTo(Comparable)
Comparator Comparator()
comparator
将有一个
default
实现,该实现返回一个
comparator
对原始对象调用
compareTo()
。@Patrickhoffman文章作者当然提到了抽象类,但它也有缺点:如果你读过他,你会怎么想,如果没有,我建议你这么做,我会感兴趣的。