Pen*_*One 1 java class class-method
我有两个类,Foo1并且Foo2它们不是分层相关的,所以实例Foo1不是实例,Foo2也不是反过来.
在与这些不同的类中,我有一个doStuffWithFoo理想情况下应该采用Foo1或Foo2作为输入的方法,然后相应地表现.这是我追求的基本想法:
private double[] doStuffWithFoo(Fooi foo, Bar bar1, Bar bar2, double fortyTwo) {
Fooi changingFoo = foo;
double[] fooBars = new double[N];
for (int i=0; i<N; ++i) {
double[] array = getArrayFromFoo(foo,bar1,fortyTwo);
double fooBar = getDoubleFromArray(array);
fooBars[i] = fooBar;
foo = foo.getNextFoo();
}
return fooBars;
}
Run Code Online (Sandbox Code Playgroud)
在那里我写了两种截然不同的方法
private double[] getArrayFromFoo(Foo1 foo, Bar bar, double fortyTwo)
private double[] getArrayFromFoo(Foo2 foo, Bar bar, double fortyTwo)
Run Code Online (Sandbox Code Playgroud)
每个Foo类都实现自己的getNextFoo()方法,返回相同类型的方法Foo.
该方法getArrayFromFoo实际上与Foo类没有任何关系,它从此方法所在的类中获取输入,因此为Foos 创建公共接口没有意义.
我认为处理这种情况的方法是:
请doStuffWithFoo拿一个通用的对象作为输入,然后检查类是否是Foo1,Foo2或别的东西.这种方法的问题是我非常喜欢编译时错误来运行时错误.
写两个版本doStuffWithFoo就像我写的两个版本一样getArrayFromFoo.这种方法的问题在于,我将复制大量代码,这些代码在某些时候更改代码时可能会导致不一致.
还有其他选择吗?我想到的理想解决方案是,如果有一种方法可以将输入类型声明为Foo1或者Foo2,这就像方法1但具有即时错误.有没有办法在Java中这样做?
尝试定义一个接口:
public interface HasDoubleArray {
public double[] getDoubleArray();
}
Run Code Online (Sandbox Code Playgroud)
然后让每个Foo1和Foo2实现这个接口,覆盖方法getDoubleArray()返回一个double[]以自己特殊的方式.然后你可以在你的导演代码中调用它:
private double[] doStuffWithFoo(HasDoubleArray hda) {
double[] array = hda.getDoubleArray();
// DO STUFF WITH array
return array;
}
Run Code Online (Sandbox Code Playgroud)
那这个呢:
private double[] doStuffWithFoo(Foo1 foo) {
double[] array = getArrayFromFoo1(foo);
doCommonStuff(array);
return array;
}
private double[] doStuffWithFoo(Foo2 foo) {
double[] array = getArrayFromFoo2(foo);
doCommonStuff(array);
return array;
}
private void doCommonStuff(double[] array) {
// common stuff
}
Run Code Online (Sandbox Code Playgroud)