Трюк как не вызвать конструктор предка.

Все знают, что конструктор предка, если его не объявить в конструкторе наследника, будет вызываться автоматически. И мы можем только определить место когда его вызывать. Оказывается можно вообще не вызывать конструктор предка.
Разгадка кроется уже в начале статьи. Нам надо самим определить вызов конструктора предка, но сделать это так, чтобы он не вызывался.

if ( !true ) {
super();
}

Почему не написать if(false)? — некоторые говорят, что компилятор может соптимизировать такой код и убрать его.

Небольшой апдейтик. Как 100% не вызвать ненужный код конструктора предка. Вобще это не хак, а стандартный метод.
Оформляем инициализацию экземпляра не в конструкторе, который остается пустым, а в методе или статической функции с возвратом этого экземпляра. Я рекомендую статич.функцию поскольку можно всем предкам давать одно имя (например init), возвращать корректный класс и это не будет пересекаться с именами методов при наследовании и не требовать дополнительного приведения результата к нужному классу.
Запись будет такая:
MyObject = CMyClass.staticInit( new CMyClass ).
Запись становится больше, чем просто new CMyClass, зато придает дополнительную гибкость.

Комментарии (5)

0
По той-же ссылке на руфлеш ранее справедливо замечено, что стоит только Адобовцам пофиксить компилятор, то головная боль любителю такого хака обеспечена :)
0
Ну хаки это как говорится на свой страх и риск. Фикс компилятора не страшен. Фикс плейера страшен.
0
Ну тут как раз как я понимаю компилятор :) это он сейчас оптимизирует так — if(false) он распознает и код внутри просто не вставляет в результат. Потом тут же сам не находит super() и радостно его вставляет первой инструкцией. А если написать if(!true) компилятор уже не оптимизирует и вставляет тело if-а, то-есть инструкцию super() (хотя никогда не исполняемую), потом тут-же его находит и спокойно не вставляет автоматом в начало конструктора.
0
Ну создавать пустые конструкторы — правильная политика программирования на АС3, как я понял. Хотя сами они ее не придерживаются. Там, например, сам автор хака делал его поскольку в АПИшном классе дергался ненужный метод.
0
Не знаю может и компилятор в байткод и компилятор в JIT так делать. Упоминаний какой именно это делает я не нашел.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.