在Java中,我可以以某种方式强制扩展抽象类的类来实现其构造函数,并将Object作为参数吗?
像
这样的东西public abstract class Points {
//add some abstract method to force constructor to have object.
}
public class ExtendPoints extends Points {
/**
* I want the abstract class to force this implementation to have
* a constructor with an object in it?
* @param o
*/
public ExtendPoints(Object o){
}
}
答案 0 :(得分:27)
您可以在抽象类中使用带参数的构造函数(如果您想禁用匿名子类,请将其保护)。
public abstract class Points{
protected Points(Something parameter){
// do something with parameter
}
}
这样做,你强制实现类有一个显式的构造函数,因为它必须用一个参数调用超级构造函数。
但是,您不能强制覆盖类具有带参数的构造函数。它总是可以伪造这样的参数:
public class ExtendPoints extends Points{
public ExtendPoints(){
super(something);
}
}
答案 1 :(得分:5)
正如其他人之前所说的,构造函数的签名不会被强制执行,但您可以使用AbstractFactory模式强制执行一组特定的参数。然后,您可以定义工厂界面的create方法以获得特定签名。
答案 2 :(得分:2)
没有构造函数不会被继承,所以每个Class都需要提供它自己的构造函数,除非你没有指定构造函数并获得默认的no args构造函数。
答案 3 :(得分:2)
可能在编译时它不可能,但是如果声明了所需的构造函数,你可以在运行时使用反射来检查:
public abstract class Points {
protected Points() {
try {
Constructor<? extends Points> constructor =
getClass().getDeclaredConstructor(Object.class);
if (!Modifier.isPublic(constructor.getModifiers()))
throw new NoSuchMethodError("constructor not public");
} catch (SecurityException ex) {
throw new RuntimeException(ex);
} catch (NoSuchMethodException ex) {
throw (NoSuchMethodError) new NoSuchMethodError().initCause(ex);
}
}
}
答案 4 :(得分:0)
如果向Points添加public Points(Object o) {}
构造函数,则强制任何子类构造函数调用该超级构造函数。但是,我认为没有办法确保子类使用那个确切的构造函数签名。
答案 5 :(得分:-1)
修改
嗯,不,它不可能强制执行带参数的构造函数。