1

编辑:对我的问题的简单回答是 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 来扩展所有这些接口,我会得到我想要的。我很高兴有些人愿意在跳到底部发布平均回复之前阅读整篇文章。

4

3 回答 3

1

接口不能被实例化——它们只能由类实现或由其他接口扩展。

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

你可以这样做,如下所示:

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

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

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

为了理解这一点,考虑一下接口 Man、Bear 和 Pig 可能每个都包含方法 walk() 的想法。

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

于 2013-06-26T05:26:10.380 回答
1

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

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

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

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

于 2013-06-26T04:58:10.917 回答
0

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

如何设计一个类型层次结构,其中一组实现相同的接口集,并且接口公开的许多行为具有共同的实现。

这种设计问题可以通过以下方式在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 {

}

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

于 2013-06-26T05:22:36.917 回答