我有多个接口和一个实现所有接口的类。我想在实现类的实例上调用这些接口中定义的所有方法,但我不想将类变量声明为类,因此我仍在编程接口。
似乎我要么:
我宁愿不做其中任何一个,因为1不是类型安全的,2可能意味着你很快会得到很多'联合'接口,这些接口本身不会增加任何东西。有可能有类似的东西:
public interface A {
public void doThis();
}
public interface B {
public void doThat();
}
public class C implements A, B {
public void doThis(){;}
public void doThat(){;}
}
//Fake calling code:
public void go() {
A,B dualTypedInstance = new C(); //
dualTypedInstance.doThis();
dualTypedInstance.doThat();
}
看起来这应该是可能的。感谢。
答案 0 :(得分:2)
你可以这样做:
ImplementsInterfaces impl = new ImplementsInterfaces();
A a = impl;
B b = impl;
答案 1 :(得分:0)
为什么不想实例化实现(a)和(b)的类(c)?
另一种方法是从(a)和(b)创建抽象类,并有两个抽象方法(每个都有一个),然后创建类(c)然后扩展(而不是实现)其他类。
答案 2 :(得分:0)
另一种选择是创建抽象超类:
public abstract class AbstractAB implements A, B {
}
public class C extends AbstractAB {
public void doThis(){;}
public void doThat(){;}
}
public void go() {
AbstractAB dualTypedInstance = new C();
dualTypedInstance.doThis();
dualTypedInstance.doThat();
}
答案 3 :(得分:0)
虽然我并不一定会在生产代码中推荐该解决方案,但在2019年做到这一点并不是完全不可能的,它还带有一个警告,即对象必须是不可变的。例如,要创建一个有效有效的类,该类具有一个实现InterfaceA和InterfaceB的实例变量,它们分别具有方法methodA()和methodB(),则可以执行类似
的操作public interface MyInterface {
public void methodA();
public void methodB();
public static <O extends InterfaceA & InterfaceB> MyInterface of(O obj){
return new MyInterface(){
public void methodA(){
obj.methodA();
}
public void methodB(){
obj.methodB();
}
};
}
这将创建一个匿名内部类,该内部类实际上具有类型为InterfaceA和InterfaceB的最终实例变量,而无需对该依赖项进行任何特定的实现。
答案 4 :(得分:0)
您也可以在Class声明中这样做:
public class<T extends A & B> SomeClass{
Void doStuff(){
T variable = new C();
}
}
答案 5 :(得分:-1)
接口应包含一个不同的抽象单元,以便它们可以单独使用,即不知道它们的实现,也不依赖于可能在类中实现的其他接口。接口可以扩展其他接口,但层次结构本身不是一个东西,它应该在您的应用程序中具有一些含义。所以,如果你被迫制作许多人工“标记”界面,那么你做错了什么的可能性很高。最后但并非最不重要的是,您可以拥有一个可以实现必要接口的抽象基类。
让我用一个简单的例子来说明这一点。假设您正在为应用程序创建前端。您可以考虑可以拖动或可实现的不同面板。用java术语表示,可以有两个接口:Draggable
带有drag()
方法,Resizable
带有redize()
方法。在拖动事件下,您的API不应该知道实现类的详细信息,它应该关注的唯一事情是,此类是否实现Draggable
。但是你希望有一个具体的实现,其中两个接口以可能不同的方式实现,你可以创建一个抽象类作为具体实现的基础:abstract class BasePanel extends Panel implements Draggable, Resizable
。这样,您就可以在单独的“拖动”和“调整大小”上下文中隐藏的方式声明您的类。另一方面,如果你想拥有一个能够识别它们的上下文,你可以创建另一个扩展两个基本接口的接口,并可能添加另一个方法,如public interface GuiUnit extends Draggable, Resizable
。
最后,我的想法是向您展示,当您期望在不相关的接口之间进行条件转换时,应该避免设计情况,并且要么将实现基于您期望处理的一个接口,要么基于某些抽象类。如果您认为这还不够 - 那么您最好重新考虑您的设计考虑因素。