实现多个接口的类的类型

9

我目前正在尝试编写一些类,遇到了以下问题:

我正在尝试编写一个实现两个接口功能的类。

interface IA {
 public void doSomething();
}

interface IB {
 public void doSomethingToo();
}

我有两个实现这些接口的类:

class FooA implements IA, IB{

}

class FooB implements IA, IB{

}

有没有一种方法可以做到这一点:
public <type> thisClassImGonnaUse = returnEitherFooAOrFooB();
thisClassImGonnaUse.doSomething();
thisClassImGonnaUse.doSomethingToo();

所以 thisClassImGonnaUse 应该可以使用这两个方法。我不明白为什么会有问题。也许我漏掉了什么东西。 - Mridul Kashatria
嗯,有点。thisClassImGonnaUse 是什么类型的? :) - Timo Willemsen
好的,我明白了。类型需要是一个接口,并且不能将两个接口指定为<type>。 - Mridul Kashatria
4个回答

9

设计一个新的界面

public interface IAandB extends IA, IB 

并让FooA和FooB来实现它。

1

你可以创建一个抽象基类或另一个接口,它同时扩展了IA和IB。

abstract class Base implements IA, IB{}

class FooA extends Base implements IA, IB{...}

1
谢谢你的回答。你选择使用了一个抽象类,那么和使用接口有什么区别呢?也许只是语义上的差异,但我真的想不出哪种更好。 - Timo Willemsen
在这种情况下,其实没有什么!对于你的情况,由于你没有基类,使用抽象类也是一种可能性,我只是想提出来。我原本想说“一个抽象基类或另一个接口”,并为两者都举例,但我看到其他答案已经给出了接口方法的示例,所以我没有为此提供示例。 - Bala R

1

这可能不是您想要的,但您可以创建一个第三个接口,它同时扩展了这两个接口:

interface IAandB extends A, B {}

那么FooAFooB将会实现IAandB,而不是直接实现IAIB

class FooA implements IAandB{}
class FooB implements IAandB{}

然后,您可以声明thisClassImGonnaUse为类型IAandB

public IAandB thisClassImGonnaUse = returnEitherFooAorFooB();
thisClassImGonnaUse.doSomething();
thisClassImGonnaUse.doSomethingToo();

0
如果有可能一个类实现了IAIB,并且这个事实在你所处理的问题域中具有概念上的意义,那么就可以像这样拥有一个IAB
interface IAB extends IA, IB { /* nothing */ }

判断在你的情况下是否有意义可能就像问自己“什么是IAB的好名称?”一样简单。如果你能想出一个令人满意的答案,那么你可以直接添加该接口。如果不能,那么你需要找到正确的位置放置你的两个。

thisClassImGonnaUse.doSomething();
thisClassImGonnaUse.doSomethingToo();

lines

将成为FooAFooB的一个方法(或这两个类的基类)。这样,您就不必对实现接口的类的性质进行转换或猜测(这可能会在以后变得无效或麻烦)。


好的,是的,我也在考虑这个问题。不过我有一个问题,其中一个接口(假设为IA)来自另一个库。 - Timo Willemsen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接