我有一些简单的Java代码,其结构与此类似:
abstract public class BaseClass { String someString; public BaseClass(String someString) { this.someString = someString; } abstract public String getName(); } public class ACSubClass extends BaseClass { public ASubClass(String someString) { super(someString); } public String getName() { return "name value for ASubClass"; } }
我将有很多的子类BaseClass,每个子类以getName()自己的方式(模板方法模式)实现方法。
BaseClass
getName()
这很好用,但是我不喜欢子类中有多余的构造函数。输入更多,难以维护。如果要更改BaseClass构造函数的方法签名,则必须更改所有子类。
当我从子类中删除构造函数时,出现此编译时错误:
Implicit super constructor BaseClass() is undefined for default constructor. Must define an explicit constructor
我想做的事可能吗?
你会收到此错误,因为没有构造函数的类具有默认构造函数,该构造函数没有参数,并且等效于以下代码:
public ACSubClass() { super(); }
但是,由于你的BaseClass声明了一个构造函数(因此没有默认值,否则将由编译器提供no-arg构造函数),这是非法的-扩展BaseClass的类无法调用,super();因为没有无参数的构造函数在BaseClass中。
super()
这可能有点违反直觉,因为你可能认为子类自动具有基类所具有的任何构造函数。
解决此问题的最简单方法是,基类不声明构造函数(因此具有默认的no-arg构造函数)或具有声明的no-arg构造函数(无论是单独使用还是与任何其他构造函数一起使用)。但是通常无法应用这种方法-因为你需要将任何参数传递到构造函数中,以构造类的合法实例。