gpt4 book ai didi

java - C# 相当于接口(interface)中的 Java 8 默认方法

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:14:53 25 4
gpt4 key购买 nike

我听说在 Java 8 中可以灵活地在接口(interface)中定义函数。我认为我们可以在所有实现此类接口(interface)的类中使用此功能设置一些默认状态。

那么,我的问题是,截至目前,我们在 C# 中是否有任何此类功能?微软在这方面有什么计划吗?

最佳答案

更新

默认接口(interface)方法 are a planned feature for C# 8 .

原始答案

C# 没有这个确切的特性,但是 Extension Methods解决在 Java 中引入默认方法来解决的相同问题。

为了在 Java 8 中向常见集合引入类似 LINQ 的函数方法,语言设计者想要一种方法来向接口(interface)添加方法,例如 Iterable<> .毕竟,.filter(a -> ...).map(a -> ...)语法比 map(filter(a ->...), a2 -> ...) 更容易阅读,如果他们只是添加实用方法,这就是他们必须做的事情。然而,仅仅向接口(interface)添加一个方法签名将是一个破坏性的变化,因为任何曾经实现该接口(interface)的人都会突然拥有不在 Java 8 中构建的代码,除非他们实现了新方法。因此,他们开发了默认实现方法,以便在现有接口(interface)上放置新方法不会破坏现有代码。

几年前,C# 通过引入扩展方法解决了同样的问题。扩展方法并没有真正改变接口(interface)本身,它只是使使用实用程序类中定义的方法(如 .Where().Select() 上的 IEnumerable<> 方法)变得容易,就好像它实际上在目标对象上一样.

对扩展方法和默认实现的限制使它们在范围上非常相似。两者各有优缺点,在此不一一赘述,但本质上它们只是解决同一问题的两种不同方法。

因为它与您的特定问题相关:扩展方法的缺点之一是(静态)它们破坏了面向对象代码的一些最佳实践:它们之间可能存在命名冲突,您可以例如,'可靠地覆盖它们。因此,通常最好避免使用它们,除非您遇到无法通过任何其他方式轻松解决的问题。如果您只是希望提供方法的默认实现,通常最好使用基类,并期望人们扩展您的基类。

我想您会发现大多数 Java 专家都会对 Java 中的默认实现说同样的话。在 Java 8 之前没有引入它们,因为普遍的看法是接口(interface)是用来定义事物能够做什么的什么,而类是用来定义事物如何的事情已经完成。当然,你总能找到一些smart people who think there's no good reason to have interfaces in the first place .但是,如果您正在使用接口(interface),那大概是因为您看到了在不提供实现细节的情况下定义契约(Contract)的值(value)。引入默认实现是为了解决一个非常具体的向后兼容性问题,如果您首先可以避免该问题,那么我认为没有任何充分的理由使用它们。

扩展方法同时更危险也更强大,因此除了向后兼容问题之外,它们还有一些好的用途,但它们仍应谨慎使用,并且只有在其他更面向对象的方法不适用时才使用。不工作。

关于java - C# 相当于接口(interface)中的 Java 8 默认方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41226172/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com