![]() |
Проблема с инициализацией переменной
переменная a:boolean = false определена в классе class_parent. Конструктор класса class_child расширяющий class_parent:
a = true; super(); так вот. трейс после конструктора показывает true хотя, если я не ошибаюсь при вызове конструктора суперкласса происходит инициализация прееменных супер класса. Тоесть переменная должна переопределиться в false. Если я ошибаюсь, объясните как происходит порядок инициализации, или дайте ссылку, где об этом можно почитать |
Код AS3:
Код AS3:
Код AS3:
|
Цитата:
trace("Parent: init members"); будет вызвано 1 раз, сколько бы экземпляров не создавали. Т.е. это статическая инициализация, не уверен, что это корректная демонстрация порядка инициализации _нестатических_ переменных Попробуем выкрутиться: Код AS3:
Так, а если просто Boolean? Код AS3:
|
Вот такой пример:
Код AS3:
Код AS3:
Код AS3:
A init B init B constr false A constr true А если сделать наоборот protected var t:Boolean = false; а потом переопределить ее в true в дочернем классе то результат будет такой: A init B init B constr true A constr true Почему в одном случае она переопределяется, а в другом нет? |
Может после super() установить нужное значение и забить?
А нужное самому суперклассу загнать в конструктор? Но лучше, конечно, перед этим в документации поискать порядок инициализации полей, а то так и останется загадкой (мне это делать сейчас лень запрещает) |
Думаю, при инициализации переменных берется только класс переменной из родительского. Для Boolean значение по умолчанию 'false'. После вызова родительского конструктора, переменной задается значение, если значение задано до вызова super(), то значение родительского класса игнорируется(что логично в общем-то). Если super() не вызывается в конструкторе, компилятор добавляет его в первую инструкцию конструктора наследника.
Код AS3:
|
Именно поэтому я инициализирую переменные в конструкторе.
|
А вот *** там.... Сорри ввел в некоторое заблуждение.
Родительский конструктор изменяет переменную даже после ее "переопределения" в потомке. Если трейсануть после super() в B классе, результатом будет: Код:
cnt AAdobe: В противном случае ссылка super может повести себя не так, как предполагалось. пусть и про ссылку, но по теме. |
>> Почему в одном случае она переопределяется, а в другом нет? (пост #4)
такое есть предположение: инициализация дефолтовым значением (false в этом случае) просто опускается, ну и не переопределяется ничего вот и для целых такая же картина Код AS3:
Код AS3:
Добавлено через 18 минут или как вариант инициализировать так чтоб компилятор 'не знал' чем и не своевольничал, типа Код AS3:
|
| Часовой пояс GMT +4, время: 13:48. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.