Запретить использование метода подкласса - PullRequest
2 голосов
/ 14 апреля 2011

У меня есть нечто, что в принципе напоминает следующее:

public class Generic {

    public Generic(){
        doStuff();
    }

    protected void doStuff(){
        System.out.println("Generic");
    }

}

public class Specific extends Generic {

    public Specific(){
        super();
    }

    protected void doStuff(){
        super.doStuff();
        System.out.println("Specific");
    }

}

Ошибки, которые я получаю, указывают на то, что хотя метод вызывается из суперкласса, он вызывает версию метода подкласса. В приведенном выше примере создание нового Specific будет выводить как «Generic», так и «Specific», хотя doStuff () был вызван конструктором Generic.

Короче говоря, я этого не хочу. В методе подкласса есть некоторые дополнительные функции, которые вызывают проблемы, если он вызывается до полной инициализации объекта. Как я могу в конструкторе суперкласса заставить его использовать собственную версию метода, а не самую специализированную?

Ответы [ 2 ]

5 голосов
/ 14 апреля 2011

Я не думаю, что у вас может быть функция в Java, которая может быть переопределена как A), так и B) при вызове не ведет себя полиморфно.Я бы посоветовал вам сделать что-то подобное для имитации поведения, о котором вы спрашиваете:

public class Generic {

    public Generic(){
        doGenericStuff();
    }

    private final void doGenericStuff() {
        System.out.println("Generic");
    }

    protected doStuff(){
        doGenericStuff();
    }

}

public class Specific extends Generic {

    public Specific(){
        super();
    }

    protected doStuff(){
        super.doStuff();
        System.out.println("Specific");
    }

}
2 голосов
/ 14 апреля 2011

Как насчет наличия инициализированного логического флага в вашем Определенном классе, например:

public class Specific extends Generic {
    boolean initialized = false;
    public Specific(){
        super();
        initialized = true;
    }

    @Override
    protected void doStuff(){
        super.doStuff();
        if (!initialized) return;
        System.out.println("Specific");
    }

    public static void main(String[] args) {
        @SuppressWarnings("unused")
        Specific specific = new Specific();
    }
}

Этот метод просто вызывает метод doStuff () Generic, поскольку флаг initialized имеет значение false, когда создается родительский класс, а дочерний класс создается не полностью. Я считаю, что это было основной причиной, по которой не хотелось вызывать переопределенный метод Specific.

...