【问题标题】:Does C# allow to do the same as Java 8 now can for Interface ClassC# 是否允许对接口类执行与 Java 8 相同的操作
【发布时间】:2015-11-03 10:28:30
【问题描述】:

来自this blog

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

新的 C# 版本是否也允许这样做,或者在某些预期的将来会允许这样做吗?

我一直觉得 Interface 在理论上很好,但在实践中给您的界面消费者带来了许多类型的维护噩梦,如文章中所述。

更新:我也对批评者感兴趣,如果您阅读了作者的文章,尤其是关于抽象类替代不能解决现实世界问题的文章,那就更是如此了。

【问题讨论】:

  • 对我来说,这些“改进”听起来很糟糕。接口中的默认方法?你在开玩笑吗?如果你有一些基本的通用逻辑,用virtual方法定义一个抽象类。接口是一个很好的工具,它有助于分离定义和实现。 “默认”方法绝对不遵循这个逻辑。
  • @YeldarKurmangaliyev 老实说,在我看到它是如何在行动中使用之前,我不会把它写下来。我相信他们添加它的主要原因是在他们的集合中支持 C# 已经解决的 Lambda 扩展扩展方法非常好,我认为我们不需要另一种方法来做 C# 中已经可能的事情,但我们必须看看人们是否想出了巧妙的东西,以使其在现有事物的扩展之外有意义。跨度>
  • @YeldarKurmangaliyev 我希望Java设计者有一些基本的通用逻辑;)这已经没有什么功能要求了,你能准确反驳作者的论点吗。

标签: java c# interface


【解决方案1】:

由C#中的实现类来确定实现的方法或属性的范围。 C# 知道implicit and explicit interface implementation,这有助于设置方法的范围。 (您可以创建具有所需范围(internalprivateprotected)的辅助方法或属性。

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

而默认方法只是……太可怕了。创建一个abstract 课程。期间。

【讨论】:

  • 接口中的静态方法允许您将实用程序方法放在适当的位置,例如Comparator.comparingBy。我也不是 100% 相信接口中的默认方法,但我个人认为对于如何在不破坏现有代码的情况下发展接口的问题,它比 C# 扩展方法更好。
  • 我不认为扩展方法可以解决不断变化的接口问题。还有其他方法可以解决这些问题。在我看来,不能依赖编译器告诉我要实现什么更糟糕。
  • @PaulBoddington default 如果您有一种方法依赖于另一种方法,则这些方法很有用。例如,您可能有一个接口Comparable<T>,它提供了两种方法:int compareTo(Comparable<T>)Comparator<T> comparator()comparator 将有一个 defaultimplementation,它返回一个 Comparator<T>,它在原始对象上调用 compareTo()
  • @PatrickHofman 文章的作者当然提到了抽象类,但它也有缺点:如果你读过他,你怎么看,如果没有我建议你读,我会感兴趣。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-06
  • 1970-01-01
  • 2014-06-20
  • 1970-01-01
相关资源
最近更新 更多