如何将多个接口组合到一个通用的单一接口中?

时间:2013-06-26 04:48:12

标签: java inheritance interface polymorphism encapsulation

编辑:我的问题的简单答案是Java允许一个接口扩展多个其他接口。这就是我在一个公共界面中如何将接口分组在一起的逻辑问题。这个答案没有出现在愚蠢的问题中。问题也不同,它不是关于创建接口组。

在Java中是否有理由不能将一个接口定义为实现其他接口?我看到并且不满意的答案是“接口本身不包含实现,那么接口如何实现其他接口呢?”嗯,在我看来,这是一个微弱的答案,因为它更多地是对英语语义的点头,而不是对场景的逻辑解释。对场景的逻辑解释是因为我们可以定义类来实现许多接口,为什么我们不能定义一个本身代表接口集合的接口。

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

在回答“创建一个实现接口列表的抽象超类,并让所有子类扩展该超类”之前,请记住,您不能假设这些类还没有扩展类。 implements关键字的一个好处是,您可以在不必更改其分类的情况下调整类,对吧?

我想长话短说:为什么程序员不能定义只是其他接口组的接口?或者,更好的问题可能是:如果我不能将接口定义为实现其他接口,我如何定义其他接口组的接口?

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

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来扩展所有这些接口,我会得到我想要的。我很高兴有些人愿意阅读整篇文章,然后跳到底部发布平均回复。

3 个答案:

答案 0 :(得分:1)

您可以定义一个接口,该接口是其他接口的集合。它叫做扩展接口。您可以扩展多个接口。

至于为什么你不能在接口中定义方法,它是Java接口的定义方式。你所说的问题是单一继承的后果。

但是您会很高兴地知道,在即将推出的新Java 8中,有一个名为Virtual Extension Methods的功能可以解决您所说的大型代码库问题。

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

答案 1 :(得分:1)

接口无法实例化 - 它们只能由类实现或由其他接口扩展。

我相信你应该做的是扩展接口。

您可以执行此操作,如下所示:

public interface ManBearPig implements Man, Bear, Pig {
    //interface body
}

然后,您可以在需要的地方实施ManBearPig。

您需要记住的是接口支持多重继承。

要理解这一点,请考虑接口Man,Bear和Pig可能各自都包含方法walk()的想法。

如果要在类中实现ManBearPig并调用walk()方法,它将同时实现Man,Bear和pig的walk方法。

答案 2 :(得分:0)

根据我的理解,您的问题陈述是:

  

如何设计一个Type层次结构,其中一组 Classes 实现相同的接口,并且接口公开的许多行为具有共同的实现。< /强>

这种设计问题可以通过以下方式在Java中解决(通过示例代码解释)

public abstract class AbstractAllBar implements IBar1, IBar2, IBar3{

/* Provide implementations of methods whose behavior remains unchanges for all of it's children classes.*/

}

现在,这个抽象类可以由具有抽象类 AbstractAllBar 定义的公共行为集的类进行扩展。

public class ParentClass1 extends AbstractAllBar {

.......    

}

public class ParentClass2 extends AbstractAllBar {

.......    

}

public class Foo extends ParentClass1 {

}

public class Baz extends ParentClass2 {

}

这种抽象类提供 Skeleton Implementation 。可以在 Collection API 中找到 骨架实现 的示例。您可以参考 AbstractList AbstractSet 的源代码,以使其更清晰。