java - 如何将多个接口(interface)分组为一个通用的单个接口(interface)?

标签 java inheritance interface polymorphism encapsulation

编辑:我的问题的简单答案是 Java 允许一个接口(interface)扩展多个其他接口(interface)。这就是回答我的逻辑问题:如何将接口(interface)组合到一个公共(public)接口(interface)中。这个答案没有出现在愚蠢的问题中。而且问题也不同,它不是关于创建接口(interface)组。

在 Java 中是否存在无法定义一个接口(interface)来实现其他接口(interface)的原因?我看到并不满意的答案是“接口(interface)本身不包含实现,那么接口(interface)如何实现其他接口(interface)呢?”嗯,在我看来,这是一个很弱的答案,因为它更多的是对英语语义的认可,而不是对场景的逻辑解释。该场景的逻辑解释是,既然我们可以定义类来实现许多接口(interface),为什么我们不能定义一个本身代表接口(interface)集合的接口(interface)。

假设您有许多类,您希望每个类都实现一组大型的通用接口(interface)。按照目前的情况,您必须明确写出每个类的列表。这意味着,如果稍后您必须向众多接口(interface)列表中添加另一个接口(interface),则必须修改每个类。将所有接口(interface)合并到一个“ super 接口(interface)”中将允许程序员仅在一处进行更改。

在您回答“创建一个实现接口(interface)列表的抽象父类(super class),并让所有子类扩展该父类(super class)”之前,请记住您不能假设这些类尚未扩展类。 Implements 关键字的全部好处之一是您可以调整类而无需更改其分类法,对吗?

我想长话短说是:为什么程序员不能定义只是其他接口(interface)组的接口(interface)?或者,也许更好的问题是:如果我无法将一个接口(interface)定义为实现其他接口(interface),那么我如何定义作为其他接口(interface)组的接口(interface)?

对于那些喜欢代码的人,我要问的是为什么不这样做......

public class Foo extends ParentClass1 implements IBar1, IBar2, IBar3{
}

public class Baz extends ParentClass2 implements IBar1, IBar2, IBar3{
}

...Java 允许这样做不是更有意义吗:

public interface IAllBar implements IBar1, IBar2, IBar3{
}

public class Foo extends ParentClass1 implements IAllBar{
}

public class Baz extends ParentClass2 implements IAllBar{
}

这样,以后如果我创建 IBar4,我只需修改 IAllBar.java 而不是 Foo.java 和 Baz.java。

编辑:所以根据下面的答案,我可以定义 IAllBar 来扩展所有这些接口(interface),我将得到我想要的。我很高兴有些人愿意在跳到底部发布恶意回复之前阅读整篇文章。

最佳答案

您可以定义一个接口(interface),该接口(interface)是其他接口(interface)的集合。这就是所谓的扩展接口(interface)。您可以扩展多个接口(interface)。

至于为什么不能在接口(interface)中定义方法,Java接口(interface)就是这样定义的。而你所说的问题就是单一继承带来的后果。

但是,您会很高兴地知道,在即将推出的新 Java 8 中,有一个称为“虚拟扩展方法”的功能,它可以解决您提到的大型代码库问题。

我个人认为它在遗留代码库中对于快速重构很有用,但是如果系统设计良好,您应该能够在以后摆脱默认实现。而过度使用这个特性只会导致多重继承的所有缺点。

关于java - 如何将多个接口(interface)分组为一个通用的单个接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17311738/

相关文章:

Java方法重写/接口(interface)问题

java - 过去关于构造函数的 Java 考试

Angular Material : extend a MatPaginator without creating a dupe paginator

c++ - C++ 库的 C 包装器——继承呢?

objective-c - 私有(private)接口(interface)与私有(private)方法 - objective-c

go - 如何制作一个接收自定义接口(interface)数组的函数

java - Java 中的变量和方法阴影

Java FX 在搜索查询中显示图像

Java 同步块(synchronized block)与 concurrentHashMap 与 Collections.synchronizedMap

javascript - 我对javascript原型(prototype)继承的误解