LINUX.ORG.RU

Вызвать конструктор самого-пресамого суперкласса

 , ,


0

1

Доброго времени суток. Есть такая иерархия наследований: Beverage (главнюк) -> Expresso (сущность) -> Milk (сущность-надстройка).

Задача: из Milk дернуть конструктор Beverage. super() ограничивается конструктором родителя, т.е. Expresso.

Спасибо


Ну так используй super() и в Expresso.

anonymous ()
Ответ на: комментарий от anonymous

Там тоже свой сапер, со своими тараканами. Вариант отпадает.

WennY ()
Ответ на: комментарий от WennY

а что там делается в этом супер-супер-конструкторе? может, вынести в отдельный метод?

bvn13 ★★★★★ ()
Ответ на: комментарий от bvn13

Да можно конечно, но такое убожество получается. Короче, из субпредка нельзя вызвать главного родича?

WennY ()

С точки зрения инкапсуляции это какая-то неправильная задача. Тем более, что самый-пресамый суперкласс у тебя Object, так что ты в лучшем случае вызываешь второй суперкласс в цепочке.

proud_anon ★★★★★ ()
Последнее исправление: proud_anon (всего исправлений: 1)
Ответ на: комментарий от WennY

Короче, из субпредка нельзя вызвать главного родича?

Нельзя.

Legioner ★★★★★ ()

Milk (молоко) не Expresso (сорт кофе). Стыдно не знать.

У тебя неправильная иерархия вообще. Должно быть: Beverage (напиток) -> Expresso(сорт кофе), Beverage (напиток) -> Milk (молоко). Тогда твоя проблема отпадет сама собой.

LongLiveUbuntu ★★★★★ ()
Ответ на: комментарий от LongLiveUbuntu

Стыдно ничего не понять в топе и с умным видом тупить. Вопрос исчерпан, спасибо.

WennY ()

Кстати, «espresso».

anonymous ()
Ответ на: комментарий от Legioner

разве через рефлексию нельзя узнать всех предков?

qulinxao ★★☆ ()
Ответ на: комментарий от qulinxao

Предков узнать можно, но вызывать его конструктор в обход промежуточных класов нельзя.

Legioner ★★★★★ ()
Ответ на: комментарий от Legioner

1) Через рефлексию узнать Самого Главного Предка.

Создать класслоадер и загрузить туда класс, наследующийся напрямую от СГП.

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

2) Как вариант - запилить аннотацию @MainClass, и парсить ее во время компиляции проекта. Написать Annotation Processor, который на эту аннотацию будет генерить Временный Класс в /target/gen

Еще проблема в том, что это не просто метод, а конструктор. Тут надо думать. Возможно можно как-то препроцессить СГП, автоматически копировать его конструктор в обычный метод, а конструктор заменять прокси.

stevejobs ★★★★☆ ()
Ответ на: комментарий от stevejobs

А потом тебя найдёт следующий разработчик и будет держать в подвале 3 года.

anonymous ()
Ответ на: комментарий от WennY

сделай отдельный protected конструктор Expresso с параметром, которого ещё нет, и вызывай в нем super()

вообще то что ты хочешь без костылей сделать нельзя в принципе, т.к. конструктор нельзя «вызывать» нигде кроме самой первой инструкции в конструкторе или в операторе new, в первом случае ты можешь вызвать только конструктор прямого родителя, во втором - самого класса.

Ну и конечно же, раз ты захотел такого, то ты делаешь что-то не так.

maloi ★★★★★ ()
Ответ на: комментарий от WennY

кстати, забыл совсем напомнить - даже если ты не написал super() в первой строчке конструктора, то он все равно вызовется же.

maloi ★★★★★ ()
Ответ на: комментарий от maloi

Ну и конечно же, раз ты захотел такого, то ты делаешь что-то не так.

+200999

no-dashi ★★★★★ ()
Ответ на: комментарий от stevejobs

Каких только костылей не придумают, лишь бы не пересмотреть дизайн, который явно неправильный (ну не может молоко наследовать кофе).

BattleCoder ★★★★★ ()

ТС, было бы интересно код увидеть.

BattleCoder ★★★★★ ()

выносишь логику из конструктора в метод init. далее можно изгаляться через аннотации или запилить superInit и звать её. и вообще логика в конструкторе это не правильно, ибо конструктор должен минимально инициализировать объект, а логика(=поведение) задаётся в методах.

vtVitus ★★★★★ ()

А у меня чисто философский вопрос: если пройтись вверх по иерархии наследования, то какой из предков можно считать достаточно «самым-пресамым суперклассом»? А то ведь так и до Object дойти можно.

korvin_ ★★★★★ ()
Ответ на: комментарий от BattleCoder

Задал бы ТС вопрос «как мне сделать то, что я хочу, правильно» - ответ был бы другой) А так - извините, у нас в наличии только извращения.

stevejobs ★★★★☆ ()

http://ideone.com/HYhAxG

Прислушайся к тем, кто советует не наследовать молоко от кофе, потому что через неделю ты будешь вызывать его конструктор из класса «КанистраБензина».

anonymous ()
Ответ на: комментарий от anonymous

А, это не то. Все правильно тебе сказали.

anonymous ()
Ответ на: комментарий от anonymous

Хотя, раз уж мы заговорили об изврате, и в конструкторе молока нужно избегать конструктора «кофе», то можно в кофе сделать в конструкторе первой строкой if (!(this instanceof Milk)) //....

anonymous ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.