gpt4 book ai didi

java - 如何声明 Interface 类型的变量,然后将实现该 Interface 的 Class 的对象分配给该变量,以及如何测试这一点?

转载 作者:行者123 更新时间:2023-12-02 08:46:52 25 4
gpt4 key购买 nike

我正在努力解决类和它们实现的接口(interface)之间的交互。具体来说,当类的构造函数需要参数时,如何声明一个 Interface 类型的变量,然后将实现该 Interface 的 Class 的对象分配给该变量。我是根据规范来实现的,所以我不能只添加一个不需要参数的构造函数。

我有一个构造函数,它需要 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”,它必须将接口(interface)作为输入并将其作为输出返回:

    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;
}

接口(interface)本身只定义了这个方法:

public interface example extends Example {

public example manipulate(example e);
}

就声明接口(interface) example 的变量然后将实现 example 的 exampleImpl 对象分配给该变量而言,我的方法是否有效?它还必须返回一个 example 类型的变量,但我不知道发生这种情况时 newVar1 和 newVar2 去哪里,因为它们没有在接口(interface)中定义。

我还需要使用 JUnit 4 测试此方法,并且我完全不知道如何执行此操作,因为您无法实例化 example 类型的对象,所以我如何传递参数,例如:

class exampleImplTest {
@Test
public exampleImpl testManipulate()
{
assertEquals(example,exampleImpl.manipulate(example(3,4)));
}

这显示了一个错误,因为操作不是静态方法,但是当它需要对象(this)才能工作时,如何使其成为静态方法?我可以在测试类中创建一个对象来调用此测试吗?我想检查它基于对象“this”和新对象“e”返回正确的操作。有办法做到这一点吗?

如果这个问题引起了误解,我很抱歉,我是一个完全的初学者。我很难理解如何使用接口(interface),因为规范要求我在这里使用它们。任何帮助将不胜感激。

最佳答案

(我将使用大写字母作为类和接口(interface)名称的开头)

Is my method valid in terms of declaring a variable of interface example and then assigning to the variable an object of exampleImpl that implements example?

是的,但在这种情况下不需要它,而且无论如何你也不应该这样做。您假设通过参数 e 传入的对象始终是一个 ExampleImpl 实例,因为您对该变量进行了硬编码转换。如果不是这样的类,您将得到一个ClassCastException。在这种情况下,您可以删除

Example eInst = (ExampleImpl)e;

line 并使用变量 e 代替。

It must also return a variable of type example, but I do not know where newVar1 and newVar2 go when this happens since they are not defined in the interface.

您已经编写了代码

Example summedE = new ExampleImpl(normalisedNewVar1, normalisedNewVar2);
return summedE;

它将返回一个对象,该对象实现Example接口(interface)。所以这里一切都很好。如果您想使用 newVar1newVar2 取决于您对 manipulate 方法的实现和要求。

Can I create an object within the test class to call this test on?

是的,这是正常的做法。写

Example obj = new ExampleImpl(4, 5);

在您的测试方法中创建一个可以使用的Example对象。您可以使用不同的 Example 对象调用 manipulate() 方法,如下所示:

Example obj = new ExampleImpl(4, 5);
Example obj2 = new ExampleImpl(10, 20);
Example obj3 = obj.manipulate(obj2);

I want to check it returns the right manipulation based on an object "this" and the new object "e". Is there a way to do this?

这取决于您的 Example 接口(interface)上定义的其他方法。您已经写到它是从另一个接口(interface)(也名为 Example)扩展而来的。根据接口(interface)中的定义,您可以在Example对象上调用其他方法,如下所示:

 Assert.assertEquals(42, obj3.getDifference()); // or whatever other methods you have

关于java - 如何声明 Interface 类型的变量,然后将实现该 Interface 的 Class 的对象分配给该变量,以及如何测试这一点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61015092/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com