How do I group many interfaces into a common single interface?
编辑:我的问题的简单答案是Java允许一个接口扩展多个其他接口。这就是我的逻辑问题的答案,即如何在公共接口中将接口分组在一起。这个答案没有出现在重复问题中。另外,问题是不同的,它不是关于创建接口组。
在爪哇,你不能定义一个接口来实现其他接口吗?我看到并且不满意的答案是"接口本身不包含实现,所以一个接口如何实现其他接口?"嗯,在我看来,这是一个薄弱的答案,因为它更符合英语语义学,而不是对场景的逻辑解释。场景的逻辑解释是因为我们可以定义类来实现许多接口,为什么我们不能定义一个本身表示接口集合的接口。
假设您有许多类,您希望每个类实现一个由多个接口组成的大型公共集合。正如目前的情况,您必须为每个类显式地写出列表。这意味着,如果以后必须向多个接口列表中添加另一个接口,则必须修改每个类。将所有接口合并到一个"超级接口"中,将允许程序员只在一个地方进行更改。
在回答"创建一个实现接口列表的抽象超类,并让所有子类扩展该超类"之前,请记住,不能假定这些类尚未扩展类。implements关键字的一个好处是,您可以在不改变分类的情况下修改类,对吗?
我想长话短说的是:为什么程序员不能定义仅仅是其他接口组的接口?或者,也许更好的问题是:如果我不能将一个接口定义为实现其他接口,如何定义属于其他接口组的接口?
对于那些喜欢代码的人,我要问的是为什么不这样做…
1 2 3 4 5 | public class Foo extends ParentClass1 implements IBar1, IBar2, IBar3{ } public class Baz extends ParentClass2 implements IBar1, IBar2, IBar3{ } |
对于Java来说,这样做是否更有意义:
1 2 3 4 5 6 7 8 | 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来扩展所有这些接口,我会得到我想要的。我很高兴有些人愿意在跳到最底层之前读完一整篇文章,然后发表一些中庸的回答。
接口不能被实例化,它们只能由类实现或由其他接口扩展。
我相信您应该做的是扩展接口。
您可以这样做,如下所示:
1 2 3 | public interface ManBearPig implements Man, Bear, Pig { //interface body } |
然后,您可以在需要的地方实现manbearspig。
您需要记住的是,接口支持多重继承。
要理解这一点,请考虑这样一个想法:界面man、bear和pig可能都包含方法walk()。
如果要在类中实现manbearspig并调用walk()方法,它将同时实现man、bear和pig的walk方法。
您可以定义一个接口,它是其他接口的集合。它被称为扩展接口。您可以扩展多个接口。
至于为什么不能在接口中定义方法,它是如何定义Java接口的。你所说的问题是单一继承的后果。
然而,您将很高兴知道,在即将到来的Java 8中,有一个称为虚拟扩展方法的特性,它解决了您所说的大的代码基础问题。
我个人认为它在旧代码库中对于快速重构很有用,但是如果系统设计得很好,那么您以后应该能够摆脱默认的实现。过度使用这个特性只会导致多重继承的所有缺点。
根据我的理解,你的问题陈述是:
How to design a Type hierarchy where a group of Classes implement same set of Interfaces and a number of behaviors exposed by the interfaces have common implementation.
号
这种设计问题可以用下面的方式用Java来解决(用示例代码解释)
1 2 3 4 5 | public abstract class AbstractAllBar implements IBar1, IBar2, IBar3{ /* Provide implementations of methods whose behavior remains unchanges for all of it's children classes.*/ } |
现在,这个抽象类可以由具有抽象类abstractallbar定义的公共行为集的类扩展。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | public class ParentClass1 extends AbstractAllBar { ....... } public class ParentClass2 extends AbstractAllBar { ....... } public class Foo extends ParentClass1 { } public class Baz extends ParentClass2 { } |
号
这种抽象类提供了框架实现。框架实现的示例可以在集合API中找到。您可以引用AbstractList和AbstractSet的源代码,使其更清晰。