我目前正在尝试编写一些类,我遇到了以下问题:
我正在尝试编写一个从两个接口实现某些功能的类
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();
答案 0 :(得分:9)
做一个新界面
public interface IAandB extends IA, IB
并改为实现FooD和FooD。
答案 1 :(得分:1)
您可以创建一个抽象基类或另一个扩展IA和IB的接口
abstract class Base implements IA, IB{}
和
class FooA extends Base implements IA, IB{...}
答案 2 :(得分:1)
这可能不是您想要的,但您可以创建一个扩展它们的第三个界面:
interface IAandB extends A, B {}
然后FooA
和FooB
将直接实施IAandB
而不是IA
和IB
:
class FooA implements IAandB{}
class FooB implements IAandB{}
然后,您可以将thisClassImGonnaUse
声明为IAandB
类型:
public IAandB thisClassImGonnaUse = returnEitherFooAorFooB();
thisClassImGonnaUse.doSomething();
thisClassImGonnaUse.doSomethingToo();
答案 3 :(得分:0)
如果某个类有可能实现IA
和 IB
,并且这个事实在概念上对您所处理的问题域有意义,那么这样的IAB
interface IAB extends IA, IB { /* nothing */ }
确定如果 它在你的情况下是否有意义可能就像问自己什么是IAB的好名字一样简单?如果你能想出一个令人满意的回答这个问题,你可以添加那个界面。如果不是,那么适合你的两个
thisClassImGonnaUse.doSomething();
thisClassImGonnaUse.doSomethingToo();
行是FooA
或FooB
(或这两者的基类)的方法。这样您就不必对实现接口的类的性质进行强制转换或猜测(以后可能会变得无效或麻烦)。