Подтвердить что ты не робот

Java заставляет расширяющийся класс

В Java я могу каким-то образом заставить класс, который расширяет абстрактный класс, реализовать свой конструктор с объектом как параметром?

Что-то вроде

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

    }
}
4b9b3361

Ответ 1

Вы можете использовать конструктор с параметром в своем абстрактном классе (сделайте его защищенным, если вы хотите разрешить анонимные подклассы).

public abstract class Points{
    protected Points(Something parameter){
        // do something with parameter
    }
}

Выполняя это, вы вынуждаете класс реализации иметь явный конструктор, так как он должен вызывать супер конструктор с одним параметром.

Однако вы не можете заставить класс переопределения иметь конструктор с параметрами. Он всегда может подделывать параметр следующим образом:

public class ExtendPoints extends Points{
    public ExtendPoints(){
        super(something);
    }
}

Ответ 2

Как уже было сказано другими, подпись конструкторов не может быть принудительно введена, но вы можете применить определенный набор аргументов, используя шаблон AbstractFactory вместо. Затем вы можете определить методы создания вашего интерфейса factory, чтобы иметь определенную подпись.

Ответ 3

Никакие конструкторы не наследуются, поэтому каждый класс должен предоставить свои собственные, если только вы не укажете конструктор и не получите конструктор args по умолчанию.

Ответ 4

Вероятно, это невозможно во время компиляции, но вы можете использовать отражение для проверки во время выполнения, если объявлен желаемый конструктор:

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);
        }
    }
}

Ответ 5

Если вы добавляете конструктор public Points(Object o) {} в Points, вы вынуждаете любые конструкторы подкласса вызывать этот супер-конструктор. Однако я не думаю, что нет способа гарантировать, что подклассы используют эту точную подпись конструктора.

Ответ 6

ИЗМЕНИТЬ

Ну, нет, его невозможно принудительно реализовать конструктор с аргументом.