【问题标题】:How to declare a variable of type Interface and then assign to the variable an object of a Class that implements the Interface, and how to test this?如何声明一个接口类型的变量,然后为该变量分配一个实现接口的类的对象,以及如何测试呢?
【发布时间】:2020-04-03 15:21:03
【问题描述】:

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

我有一个构造函数,它需要 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);
}

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

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

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

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

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

【问题讨论】:

  • 类(和接口)名称应以大写开头,以免与以小写开头的变量和方法混淆。
  • 您好,我刚刚调整了这个示例的名称,它们在脚本中是大写的。您能帮忙解答以上问题吗?

标签: java junit4


【解决方案1】:

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

我的方法在声明接口 example 的变量然后将实现 example 的 exampleImpl 的对象分配给该变量是否有效?

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

Example eInst = (ExampleImpl)e;

改为使用变量e

它还必须返回一个 example 类型的变量,但是我不知道 newVar1 和 newVar2 发生这种情况时会去哪里,因为它们没有在接口中定义。

你已经写好了代码

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

这将返回一个对象,该对象实现了Example 接口。所以这里一切都很好。是否要使用newVar1newVar2 取决于您对manipulate 方法的实现和要求。

我可以在测试类中创建一个对象来调用这个测试吗?

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

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

我想检查它是否返回基于对象“this”和新对象“e”的正确操作。有没有办法做到这一点?

这取决于您的Example 接口上定义了哪些其他方法。您已经写过它从另一个接口扩展而来,也称为Example。根据 that 接口中定义的内容,您可以像这样在 Example 对象上调用其他方法:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-30
    • 1970-01-01
    • 1970-01-01
    • 2010-10-07
    • 2017-01-02
    • 1970-01-01
    • 1970-01-01
    • 2013-10-15
    相关资源
    最近更新 更多