gpt4 book ai didi

java - 使用默认方法与抽象类的接口(interface),动机是什么?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:35:28 24 4
gpt4 key购买 nike

上下文

我最近遇到了这个 C# 提案 default interface methods我已经阅读了规范和更重要的是动机。可能我错过了什么,但动机有点让我讨厌。

接口(interface)和完全抽象类之间的唯一实际区别 future 的类可以实现(因此是[IS A])多个接口(interface),但可以继承(因此是[IS A])仅来自一个抽象类,(以及所有后果)

我不清楚抽象类和具有默认方法的接口(interface)之间的确切区别是什么现在除了我们可以使用默认方法将多重(实现)继承带入画面,这对于抽象类是不可能的。 (我不想打开问题/讨论是好是坏,这不是这里的主题)

不过讲的动机完全不同,三点:

  • “...API 作者在不破坏源代码的情况下将方法添加到 future 版本中的接口(interface)...”。好吧,“API”作者也可以在未来的版本中向抽象类添加方法,如果他实现了它们而不破坏任何东西。
  • “...使 C# 能够与面向 Android (Java) 和 iOS (Swift) 的 API 进行互操作,...”。我认为语言设计决策,尤其是关于抽象和 OOP 模式(如多重继承)的决策比与 Swift 互操作更高级别。我也觉得,这只是百分之0.0x的互操作问题,也可以通过其他方式解决。
  • “...事实证明,添加默认接口(interface)实现提供了“特性”语言功能的元素...”。这是一个非常肤浅的说法,尤其是它指的是维基百科的“特质”。根据定义,traits 允许添加方法而不多重继承(与 super 有 [IS A] 关系)。然而接口(interface)绝对是关于 [IS A]... 不是在谈论事实,特征至少是有争议的好实践

问题

我的问题是真正的区别(或动机)是什么,或者我错过了什么?

最佳答案

他们在 Java 8 中添加了此功能。因此您可以添加 Java 标记并询问 Java 开发人员他们可以使用它做什么。它显然也存在于 HaskellScala 上。

多重继承

我首先想到的是多重继承。由于一个类可以实现多个接口(interface),例如您可以解决 diamond problem .

在 Java 中,它们是这样做的:

public interface InterfaceA {
public default void foo() {
System.out.println("A -> foo()");
}
}

public interface InterfaceB {
public default void foo() {
System.out.println("B -> foo()");
}
}

private class Test implements InterfaceA, InterfaceB {
// Compilation error : "class Test inherits unrelated defaults for foo() from types InterfaceA and InterfaceB"
}

所以你要么实现方法(覆盖默认实现)要么调用 super 之一:

public class Test implements InterfaceA, InterfaceB {
public void foo() {
InterfaceB.super.foo();
}
}

关于java - 使用默认方法与抽象类的接口(interface),动机是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46539725/

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