|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
Регистрация: Apr 2010
Адрес: Earth
Сообщений: 1,897
|
Можно ли вызвать повторно конструктор?
Есть класс:
package { import flash.display.Sprite; public class Test extends Sprite { public function Test() { super(); trace( 'Test::()' ); } } } Если можно, то это чему-нибудь противоречит, ну там в плане безопасности и вообще? Последний раз редактировалось i.o.; 13.07.2010 в 17:28. |
|
|||||
Квач
Регистрация: Sep 2006
Адрес: Украина, Киев
Сообщений: 1,526
|
2 i.o.:
А зачем? о_0 Э... Противоречит, я думаю. Это как человеку родиться дважды, что противоречит божественному плану.
__________________
Да не нужно тебе читать документацию по Flash и AS от Adobe - ты слишком умён для этого |
|
|||||
Регистрация: Apr 2010
Адрес: Earth
Сообщений: 1,897
|
Просто стало интересно (с геттером и сеттером подобное работает) и сделал такой тест: // Main.as package { import flash.display.Sprite; public class Main extends Sprite { public function Main() { super(); trace( 'Main::()' ); trace( 'Main::() -> creating new Test()' ); var myTest:Test = new Test(); myTest.onTest = _onTest; myTest.test(); trace( '\nMain::() -> call myTest.constrRef()\n' ); myTest.constrRef(); myTest.constrRef(); } private function _onTest():void { trace( 'Main::() -> _onTest()' ); } } } /* Main::() Main::() -> creating new Test() Test::() Test::() -> arguments: Test::() -> arguments.length: 0 Test::() -> arguments.callee: function Function() {} Test::() -> _uniqueNumber 0: NaN Test::() -> _uniqueNumber 1: 0.6620515515096486 Test::test() -> onTest: null Test::test() -> onTest: function Function() {} Main::() -> _onTest() Main::() -> call myTest.constrRef() Test::() Test::() -> arguments: Test::() -> arguments.length: 0 Test::() -> arguments.callee: function Function() {} Test::() -> _uniqueNumber 0: NaN Test::() -> _uniqueNumber 1: 0.758148159366101 Test::test() -> onTest: function Function() {} Main::() -> _onTest() Test::() Test::() -> arguments: Test::() -> arguments.length: 0 Test::() -> arguments.callee: function Function() {} Test::() -> _uniqueNumber 0: NaN Test::() -> _uniqueNumber 1: 0.2633880809880793 Test::test() -> onTest: function Function() {} Main::() -> _onTest() */ // Test.as package { import flash.display.Sprite; public class Test extends Sprite { public function Test( in_param1:String='in_param1', in_param2:String='in_param2' ) { super(); trace( 'Test::()' ); trace( 'Test::() -> arguments: ' + arguments ); trace( 'Test::() -> arguments.length: ' + arguments.length ); trace( 'Test::() -> arguments.callee: ' + arguments.callee ); constrRef = arguments.callee; trace( 'Test::() -> _uniqueNumber 0: ' + _uniqueNumber ); _uniqueNumber = Math.random(); trace( 'Test::() -> _uniqueNumber 1: ' + _uniqueNumber ); test(); } public var onTest:Function; public var constrRef:Function; private var _uniqueNumber:Number; public function test():void { trace( 'Test::test() -> onTest: ' + onTest ); if( onTest != null ) onTest(); } } } Ведь если бы это создавался новый экземпляр, то никак бы не мог вызываться колбак onTest. Следовательно действительно получается вызвать повторно конструктор. Поправьте, если не прав. Последний раз редактировалось i.o.; 13.07.2010 в 17:55. |
|
|||||
Квач
Регистрация: Sep 2006
Адрес: Украина, Киев
Сообщений: 1,526
|
2 i.o.:
Ну, конструктор - это функция, которая вызывается после создания экземпляра класса. В ней обычно происходит инициализация чего-нибудь. Членов класса, например. Только вызывать конструктор несколько раз... как-то странно что ли... Да и ни к чему. Можно просто описать какую-нибудь публичную функцию init и выполнять её в конструкторе и так, как метод класса, без сохранения ссылок на конструктор.
__________________
Да не нужно тебе читать документацию по Flash и AS от Adobe - ты слишком умён для этого |
|
|||||
Регистрация: Apr 2010
Адрес: Earth
Сообщений: 1,897
|
Все бы ничего, да вот только super() можно вызывать только в конструкторе. Да и по задумке похоже, что это делать нужно только один раз, а тут выходит, что вызывай сколько влезет. Это баг или так и задумано?
|
|
|||||
стервочка (я мужик)
|
баг конечно.
|
|
|||||
Регистрация: Apr 2010
Адрес: Earth
Сообщений: 1,897
|
BlooDHounD, прокомментируйте, почему баг? Чему противоречит?
Если про то, что конструктор вызывается только один раз: с другой стороны он такая же функция... А так, пока что, сомнения между "баг" и "изящная реинициализация, хоть и не безопасная" )) Последний раз редактировалось i.o.; 13.07.2010 в 18:36. |
|
|||||
Регистрация: Jun 2010
Адрес: Беларусь, Гродно
Сообщений: 58
|
а мне понравился аналог про родиться дважды...
|
|
|||||
Регистрация: Apr 2010
Адрес: Earth
Сообщений: 1,897
|
так называемое "Рождение" происходит при использовании оператора new. А в конструкторе идет инициализация переменных и суперкласса. Конструктор всего лишь функция. Так что где вы тут повторное "рождение" разглядели мне неясно.
Вопрос то в другом: считать ли это багом и почему? |
Часовой пояс GMT +4, время: 12:05. |
|
« Предыдущая тема | Следующая тема » |
Опции темы | |
Опции просмотра | |
|
|