java强制扩展类

时间:2011-05-17 09:01:10

标签: java constructor abstract-class

在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){

    }
}

6 个答案:

答案 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)

修改

嗯,不,它不可能强制执行带参数的构造函数。