我正在努力实现它们所实现的类和接口之间的交互。具体来说,当类的构造函数需要参数时,如何声明接口类型的变量,然后将实现接口的类的对象分配给该变量。我是基于规范来实现的,因此不能仅添加不需要参数的构造函数。
我有一个构造函数,需要2个参数和getter方法:
public class exampleImpl implements example{
private int var1;
private int var2;
public exampleImpl(int var1, int var2) {
if(var2< 0) {
var1 = 1;
var2 = 1;
}
public int getVar1(){
return Var1;
}
public int getVar2(){
return Var2;
}
然后我有一个方法“ manipulate”,它[[必须将接口作为输入并将其作为输出返回:
public example manipulate(example e) {
example eInst = (exampleImpl)e;
int newVar1 = (this.getVar1()*eInst.getVar2() + this.getVar2()*eInst.getVar1());
int newVar2 = this.getVar2()*eInst.getVar2();
Pair<Integer, Integer> pair = normaliseExample(newVar1, newVar2);
int normalisedNewVar1 = pair.getKey();
int normalisedNewVar2 = pair.getValue();
example summedE = new exampleImpl(normalisedNewVar1, normalisedNewVar2);
return summedE;
}
接口本身仅将此方法定义为:
public interface example extends Example { public example manipulate(example e); }
我的方法在声明接口示例的变量然后为该变量分配一个实现示例的exampleImpl对象方面是否有效?它还必须返回类型为example的变量,但是这种情况发生时我不知道newVar1和newVar2在哪里,因为它们未在接口中定义。[我还需要使用JUnit 4测试此方法,并且由于无法实例化类型为example的对象,所以我完全不知道如何执行此操作,因此如何传递参数,例如:
class exampleImplTest { @Test public exampleImpl testManipulate() { assertEquals(example,exampleImpl.manipulate(example(3,4))); }
这会显示错误,因为操作不是静态方法,但是当它需要一个对象(this)才能工作时如何使其成为静态方法?我可以在测试类中创建一个对象来调用此测试吗?我想检查它是否基于对象“ this”和新对象“ e”返回正确的操作。有办法吗?很抱歉,如果有人误解这个问题,我是一个完整的初学者。我很难理解如何使用接口,因为规范要求我在这里使用它们。任何帮助将不胜感激。
((我将使用大写字母表示类和接口名称的开头)
我的方法在声明接口example的变量方面然后将实现example的exampleImpl对象分配给该变量是否有效?
是,但是在这种情况下,不需要它,而且无论如何您都不应该这样做。您假定通过参数e
到达的对象将始终是ExampleImpl
实例,因为您对该变量进行了硬编码转换。如果不是这样的课程,您将获得一个ClassCastException
。在这种情况下,您可以删除
Example eInst = (ExampleImpl)e;
行并使用变量e
。它还必须返回示例类型的变量,但由于在接口中未定义它们,因此我不知道newVar1和newVar2发生在哪里。您已经编写了代码
Example summedE = new ExampleImpl(normalisedNewVar1, normalisedNewVar2); return summedE;
将返回一个对象,该对象实现Example
接口。所以这里一切都很好。如果要使用newVar1
和newVar2
取决于您的实现和对manipulate
方法的要求。我可以在测试类中创建一个对象来调用此测试吗?是的,这是正常的做法。写
Example obj = new ExampleImpl(4, 5);
在您的测试方法中创建可以使用的Example
对象。您可以使用不同的manipulate()
对象调用Example
方法,如下所示:
Example obj = new ExampleImpl(4, 5); Example obj2 = new ExampleImpl(10, 20); Example obj3 = obj.manipulate(obj2);
接口中定义的内容,您可以像这样在我想检查它是否基于对象“ this”和新对象“ e”返回正确的操作。有办法吗?这取决于在
Example
接口上定义了哪些其他方法。您已经写到它是从另一个名为Example
的接口扩展而来的。根据that
Example
对象上调用其他方法: Assert.assertEquals(42, obj3.getDifference()); // or whatever other methods you have