猿问

如何在不修改基类的情况下利用多态性

我正在使用 Eclipse 中的 Junit 测试对学生的 Java 编程作业进行评分。我的目标是尽可能少地修改学生的提交,但我目前的方法迫使我在他们的提交中键入“extends ParentClass”。


我目前的方法是将每个学生作业放在自己的包中,并从父类扩展我想测试的类


学生 A APPLE 示例班


package PA04.studentA;


import PA04.providedCode.TestApple;


public class apple extends TestApple {

    public void print() {

        System.out.println("Look I can Print A");

    }

}

学生 B 苹果示例班


package PA04.studentB;


import PA04.providedCode.TestApple;


public class apple extends TestApple {

    public void print() {

        System.out.println("Look I can Print B");

    }

}

TESTAPLE 家长班


package PA04.providedCode;


public abstract class TestApple {

    public abstract void print();

}

然后,我使用超类参数类型的辅助方法来验证学生程序的行为


学生测试计划


@Test

void testStudentA() {

     PA04.studentA.apple a = new PA04.studentA.apple();

     packageTest(a);

}

@Test

void testStudentB() {

     PA04.studentB.apple b = new PA04.studentB.apple();

     packageTest(b);

}


/**

 * helper method to test behavior of classes with the same name

* but different packages

*/

private void packageTest(TestApple a) {

  a.print();        

}

学生测试计划的输出


Look I can Print A

Look I can Print B

输出是我所期望的,但是这种方法需要我修改学生的程序来扩展父类


有没有一种方法可以在不修改它们的情况下为不同的学生班级使用辅助方法?


暮色呼如
浏览 104回答 2
2回答

慕村225694

如果它是一次性测试并且您不需要进一步维护它,则可以使用reflection. 您可以将packageTest()方法更改为:private void packageTest(Object a) {try {    Method method = a.getClass().getDeclaredMethod("print");    method.invoke(a);} catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) {    e.printStackTrace();}对于未来的作业,我强烈建议您Interface向学生提供他们必须执行的任务。

开心每一天1111

不幸的是,我想不出一个简单的方法来解决您的问题。可能值得研究使用宏添加extends ParentClass到每个包。
随时随地看视频慕课网APP

相关分类

Java
我要回答