【发布时间】:2025-12-05 10:40:02
【问题描述】:
上下文
我最近遇到了这个 C# 提案default interface methods 我已经阅读了规范和更重要的是动机。可能我错过了什么,但动机有点让我讨厌。
接口和完全抽象的类之间的唯一实际区别是,未来的类可以实现(所以是 [IS A])多个接口,但可以继承(所以是 [IS A])仅来自一个抽象类,(以及所有后果)
我不清楚抽象类和具有默认方法的接口之间的确切区别是什么现在,除了,我们可以带来使用默认方法将多个(实现)继承到图片中,这对于抽象类是不可能的。 (我不想打开问题/讨论是好是坏,这不是这里的主题)
但是动机完全不同,三点:
- "...API 作者在不破坏源代码的情况下在未来版本中向接口添加方法..."。好吧,“API”作者也可以在未来的版本中向抽象类添加方法如果他实现了这些方法而不会破坏任何东西。
- “...使 C# 能够与面向 Android (Java) 和 iOS (Swift) 的 API 互操作,...”。我认为语言设计决策,尤其是关于抽象和像多重继承这样的 OOP 模式的决策比与 Swift 互操作要高一些。我也觉得,这只是0.0x%的互操作问题,也可以通过其他方式解决。
- "...事实证明,添加默认接口实现提供了 "traits" 语言功能的元素..."。这是一个非常肤浅的说法,尤其是它指的是*的“特质”。根据定义,特征允许添加方法没有多重继承(与超级有 [IS A] 关系)。然而,接口肯定是关于 [IS A]...不是在谈论这个事实,特征至少是有争议的良好实践
问题
我的问题是真正的区别(或动机)是什么,或者我缺少什么?
【问题讨论】:
-
回复:第一个项目符号。暂时不要考虑抽象类。想想接口。你已经发布了你的项目的 v1,很多人已经实现了接口,现在你想给接口添加一个方便的方法。这就是场景,与抽象类无关。 你没有找到特别令人信服的动机这一事实并不意味着一定有一些其他动机。
-
谢谢,好点,其实我认为这值得回答。
-
扩展方法是另一种可以为接口添加“便利方法”的方法。因为不允许接口维护状态,所以添加扩展方法可以让您实现相同的目标。我个人认为他们因这种变化而搅浑水