为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

暮色呼如 2023-04-26 15:19:55
我正在使用 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();}然后,我使用超类参数类型的辅助方法来验证学生程序的行为学生测试计划@Testvoid testStudentA() {     PA04.studentA.apple a = new PA04.studentA.apple();     packageTest(a);}@Testvoid 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 ALook I can Print B输出是我所期望的,但是这种方法需要我修改学生的程序来扩展父类有没有一种方法可以在不修改它们的情况下为不同的学生班级使用辅助方法?
查看完整描述

2 回答

?
慕村225694

TA贡献1880条经验 获得超4个赞

如果它是一次性测试并且您不需要进一步维护它,则可以使用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向学生提供他们必须执行的任务。


查看完整回答
反对 回复 2023-04-26
?
开心每一天1111

TA贡献1836条经验 获得超13个赞

不幸的是,我想不出一个简单的方法来解决您的问题。可能值得研究使用宏添加extends ParentClass到每个包。



查看完整回答
反对 回复 2023-04-26
  • 2 回答
  • 0 关注
  • 103 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信