每次扩展一个类并需要它的构造函数触发时,我是否必须调用super?

时间:2018-05-07 13:19:26

标签: java

有什么办法可以在从类扩展时自动触发类构造函数吗?

我有一个TestSet.java类

public class TestSet {
    public TestSet(String name) {
        Logger.msg("Test set: " + name);
    }
}

我希望构造函数每次从这个类扩展时都会触发。

似乎我需要“手动”调用构造函数:

public class TC1SendAnEmail extends TestSet{

    //I have to type this every single time again and again...
    //---------------------------------------------------------
    public TC1SendAnEmail(String name) {
        super(name);
    }
    //---------------------------------------------------------

    public void run() {
        new EmailLogin().run();
        ...
    }

}

我想避免。 (因为我将创建数百/数千个扩展类。)

从我设法研究,我想这个功能没有在Java中实现。但似乎很奇怪,我必须一次又一次地“复制 - 粘贴”构造函数......

也许还有另一种我没看到的解决方案? (也许甚至没有使用构造函数“每次创建扩展我的TestSet类的类的实例时都会执行某些操作”。)

编辑: 是的,我可以理解为什么你认为创建数百/数千个子类是错误的。我正在创建一个大型自动化项目。这种类型的每个类都将是一个“测试”。并且会有成千上万的测试...

编辑#2: 这个问题的关键是我每次从它扩展时都需要触发超类构造函数。我的错误是将参数添加到超类构造函数中。 如果您没有向构造函数添加参数,那么它会在扩展时自动触发。

3 个答案:

答案 0 :(得分:4)

从您的评论中我了解您正在努力实现的目标。 (自动打印当前运行测试的名称)

那么下面的代码片段呢?

public class TestSet {
     public TestSet(){
         Logger.msg("Test set: " + getClass().getSimpleName());
     }
}

这个基类只是在创建时打印实现类的名称。例如。使用以下课程时:

public class TC1SendAnEmail extends TestSet {
     // your methods
}

打印:

  

测试集:TC1SendAnEmail

这很有效,因为在java中,超类的默认构造函数(没有参数的构造函数)不必被覆盖,因为编译器会自动生成它。

答案 1 :(得分:2)

否则,它将如何知道您要将name传递给它而不是其他参数?

答案 2 :(得分:1)

您可以做的是将此复制粘贴代码替换为某种Template method pattern

public class SO50215241 {

    public abstract static class TestSet {
        public TestSet() {
            System.out.println("Test set: " + getName());
        }

        abstract String getName();
    }

    public static class TC1SendAnEmail extends TestSet{

        @Override
        String getName() {
            return "TC1Name";
        }
    }

    public static void main(String[] args) {
        new TC1SendAnEmail();
    }
}

打印:

Test set: TC1Name

然后,您可以尝试为具体实现扩展某些特定版本的TestSet,而不是扩展TestSet本身。 或者在getName方法体内动态计算名称。