Вызов метода подкласса до конструктора надкласса
От: dims12 http://www.relativity.ru
Дата: 13.06.07 22:54
Оценка:
Обычно Java требует, чтобы надкласс был сконструирован перед конструированием подкласса и до вызова любого из его методов. В частности, требуется, чтобы первой строкой конструктора шёл вызов super конструктора надкласса иначе возникает синтаксическая ошибка на этапе компилляции.

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

У меня это приводит к некой чехарде.

У меня есть коллекция -- класс StorageWithTrue, в котором хранятся объекты типа IncertitudeDescription. Их можно туда добавлять и убирать. При добавлении в объект вносятся изменения, которые отражаются целостность системы хранящихся внутри StorageWithTrue объектов IncertitudeDescription. В частности, например, поскольку IncertitudeDescription представляют собой выражения, в них есть поле, указывающее, в каком другом IncertitudeDescription данный IncertitudeDescription использован в качестве подвыражения. Это нужно чтобы не было повторов и т.п.

Теперь я пишу класс Tempo extends StorageWithTrue, в котором должны храниться объекты типа Ancestral extends IncertitudeDescription. Суть в том, что Ancestral поддерживают все те же правила целостности, что и IncertitudeDescription, плюс ещё упорядочены по важности в векторе queue.

То есть, все методы класса Tempo, которые согласно их описаниям работают с IncertitudeDescription, на самом деле работают с Ancestral. Ситуация примерно такая же, как с Graphics, который на самом деле всегда Graphics2D.

И вот я переопределил метод put таким образом, чтобы он не только делал всё, что обычно делается с IncertitudeDescription, но ещё и клал объект в queue.

При этом, в конструкторе Tempo предусмотрено создание объекта на основе StorageWithTrue, при этом все элементы должны переложиться из первого во второй.

Так вот, получается, что я не могу проинициализировать queue до вызова конструктора надкласса, в то время как в конструкторе надкласса он используется через вызов переопределённого метода put.

Я применил обычный прием типа

if( queue == null ) {
   queue = new Vector<Ancestral>();
}
queue.add(wrp);


но теперь у меня получилась занятная штука, что инициализация в теле класса

private Vector<Ancestral> queue = null;


выполняется ПОСЛЕ того, как queue уже заполняется.

Вопроса, собственно, как такового нет. Просто я понимаю, что действую в какой-то запрещённой области. В частности, мне сейчас придётся убрать = null из тела класса и считать, что объект = null по умолчанию неизвестно-когда. Хотел бы, чтобы кто-то посоветовал, как всё это осуществить поправильней.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.