Как переопределить метод, который используется в родительском конструкторе? - PullRequest
4 голосов
/ 13 января 2010

У меня проблема с дизайном, которую я не знаю, как преодолеть в Java. Я хочу переопределить метод, который вызывается из родительского конструктора. Вот очень простой пример проблемы:

public class Parent {
    public Parent(){
        a();
    }

    public void a() {
        // CODE
        return;
    }
}

public class Child extends Parent {
    public Child() {
       super();
    }

    public void a() {
       super.a();
       // MORE CODE
       return;
    }
}

Я знаю, что дочерний класс не будет инициализирован, пока не будет создан родительский класс, поэтому метод childs a () вызываться не будет. Какой правильный дизайн, чтобы преодолеть эту проблему?

Ответы [ 2 ]

7 голосов
/ 13 января 2010

Будет вызвано дочернее переопределение, но дочерний конструктор еще не будет выполнен, поэтому, если он не предназначен для вызова частично инициализированного объекта, у вас могут возникнуть проблемы. Наилучшим подходом является не вызывать виртуальные методы в конструкторах . Просто - это проблема. Вы контролируете оба класса? Можете ли вы изменить дизайн, чтобы избежать проблемы?

2 голосов
/ 13 января 2010

Ребенок a () будет вызван.

Ваше предположение, что вызов () из конструктора не вызовет переопределяющий метод, является правильным в C ++, но не в Java. Действительно, инициализация полей подкласса не произойдет, но все же язык позволяет переопределять вызов метода из конструктора.

[править]

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...