LINUX.ORG.RU

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

 , ,


0

1

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

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

Спасибо



Последнее исправление: WennY (всего исправлений: 1)

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

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

WennY
() автор топика

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

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

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

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

LongLiveUbuntu ★★★★★
()

Кстати, «espresso».

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

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

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

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

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

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

stevejobs ★★★★☆
()
Ответ на: комментарий от 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
()
Ответ на: комментарий от stevejobs

У вас класслодер отклеился.

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

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

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