Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Можно ли вызвать повторно конструктор? (http://www.flasher.ru/forum/showthread.php?t=142136)

i.o. 13.07.2010 17:24

Можно ли вызвать повторно конструктор?
 
Есть класс:
Код AS3:

package
{
        import flash.display.Sprite;
 
 
        public class Test extends Sprite
        {
                public function Test()
                {
                        super();
 
 
                        trace( 'Test::()' );
                }
        }
}

Можно ли вызвать у уже созданного экземпляра еще раз функцию public function Test(), т.е конструктор?
Если можно, то это чему-нибудь противоречит, ну там в плане безопасности и вообще?

Хемуль 13.07.2010 17:27

2 i.o.:
А зачем? о_0 Э... Противоречит, я думаю. Это как человеку родиться дважды, что противоречит божественному плану.

i.o. 13.07.2010 17:35

да, сморозил чушь. А ведь как на правду было похоже...
Просто стало интересно (с геттером и сеттером подобное работает) и сделал такой тест:
Код AS3:

// 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()
 
*/

Код AS3:

// 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();
                }
        }
}

Было похоже до тех пор, пока не ввел переменную _uniqueNumber. Собственно все встало на свои места. А по-началу даже удивился ))
Ведь если бы это создавался новый экземпляр, то никак бы не мог вызываться колбак onTest. Следовательно действительно получается вызвать повторно конструктор. Поправьте, если не прав.

Хемуль 13.07.2010 18:07

2 i.o.:
Ну, конструктор - это функция, которая вызывается после создания экземпляра класса. В ней обычно происходит инициализация чего-нибудь. Членов класса, например. Только вызывать конструктор несколько раз... как-то странно что ли... Да и ни к чему. Можно просто описать какую-нибудь публичную функцию init и выполнять её в конструкторе и так, как метод класса, без сохранения ссылок на конструктор.

i.o. 13.07.2010 18:11

Все бы ничего, да вот только super() можно вызывать только в конструкторе. Да и по задумке похоже, что это делать нужно только один раз, а тут выходит, что вызывай сколько влезет. Это баг или так и задумано?

BlooDHounD 13.07.2010 18:14

баг конечно.

i.o. 13.07.2010 18:18

BlooDHounD, прокомментируйте, почему баг? Чему противоречит?
Если про то, что конструктор вызывается только один раз: с другой стороны он такая же функция...
А так, пока что, сомнения между "баг" и "изящная реинициализация, хоть и не безопасная" ))

alexberkut 13.07.2010 19:06

а мне понравился аналог про родиться дважды...

i.o. 13.07.2010 19:39

так называемое "Рождение" происходит при использовании оператора new. А в конструкторе идет инициализация переменных и суперкласса. Конструктор всего лишь функция. Так что где вы тут повторное "рождение" разглядели мне неясно.
Вопрос то в другом: считать ли это багом и почему?


Часовой пояс GMT +4, время: 17:58.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.