嗨,我无法以更好的方式重构我的代码,并且想在这里询问SO以获得一些帮助。
所以,我有一个构造函数,它接受4个不同的接口。
public Manager(FooSqlInterface foo, BarSqlInterface bar, MooSqlInterface moo, ZaaSqlInterface zaa)
{
this.foo = foo;
this.bar = bar;
this.moo = moo;
this.zaa = zaa;
}
但是,当我使用我的管理器时,我总是需要发送4个不同的接口,但我每次只使用一个接口。
我仍然希望使用我的经理,但只是委托构造函数接受的参数并将其传递给使用它的实际类。
有没有更好的方法只在构造函数中接受1个接口,并且根据它是哪个接口,它将返回该类的实例。
像这样的东西
public Manager(T type)
{
this.type = type;
execute();
}
public T execute()
{
if(type instanceof FooSqlInterface)
{
return Foo();
}
}
我试过这样的代码,但我无法让它工作。它只会提供未经检查的类型错误。
提前致谢!
答案 0 :(得分:3)
如果可能,您可以尝试使用超级界面吗?我试图做一个简单的例子。
主要强>
public static void main(String[] args) throws ParseException {
A a = new AImpl();
B b = new BImpl();
C c = new CImpl();
Manager m1 = new Manager(a);
Manager m2 = new Manager(b);
Manager m3 = new Manager(c);
m1.doSomething();
m2.doSomething();
m3.doSomething();
}
超级界面
public interface Alphabetic {
void execute();
}
<强>接口强>
public interface A extends Alphabetic {
void execute();
}
public interface B extends Alphabetic {
void execute();
}
public interface C extends Alphabetic {
void execute();
}
<强>实现强>
public class AImpl implements A {
/* (non-Javadoc)
* @see tester.A#execute()
*/
@Override
public void execute() {
System.out.println("I am A");
}
}
public class BImpl implements B {
/* (non-Javadoc)
* @see tester.A#execute()
*/
@Override
public void execute() {
System.out.println("I am B");
}
}
public class CImpl implements C {
/* (non-Javadoc)
* @see tester.A#execute()
*/
@Override
public void execute() {
System.out.println("I am C");
}
}
<强>输出强>
I am A
I am B
I am C
答案 1 :(得分:0)
以下是我使用编码进行实验的内容。 使用超级界面以及工厂模式。
/ * *要更改此许可证标题,请在“项目属性”中选择“许可证标题”。 *要更改此模板文件,请选择“工具”|模板 *并在编辑器中打开模板。 * / 包装实验;
/ ** * * @author WMads2429175 * /
public class Experiment {
public Experiment() {
X returnObject;
Manager m = new Manager(new FooY());
returnObject=m.execute();
returnObject.check();
m = new Manager(new FooZ());
returnObject=m.execute();
returnObject.check();
}
public static void main(String[] args) {
new Experiment();
}
class Manager {
X type;
public Manager(X type) {
this.type = type;
}
public X execute() {
if (type instanceof Y) {
System.out.println("mark 1");
return new FooY();
} else if (type instanceof Z) {
System.out.println("mark 2");
return new FooZ();
}
return new FooY();
}
}
interface X {
public void check();
}
interface Y extends X {
}
interface Z extends X {
}
class FooY implements Y {
public void check() {
System.out.println("I am Y");
}
}
class FooZ implements Z {
public void check() {
System.out.println("I am Z");
}
}
}