Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 13.07.2010, 17:24
i.o. вне форума Посмотреть профиль Отправить личное сообщение для i.o. Найти все сообщения от i.o.
  № 1  
Ответить с цитированием
i.o.
 
Аватар для i.o.

Регистрация: Apr 2010
Адрес: Earth
Сообщений: 1,897
По умолчанию Можно ли вызвать повторно конструктор?

Есть класс:
Код AS3:
package
{
	import flash.display.Sprite;
 
 
	public class Test extends Sprite
	{
		public function Test()
		{
			super();
 
 
			trace( 'Test::()' );
		}
	}
}
Можно ли вызвать у уже созданного экземпляра еще раз функцию public function Test(), т.е конструктор?
Если можно, то это чему-нибудь противоречит, ну там в плане безопасности и вообще?


Последний раз редактировалось i.o.; 13.07.2010 в 17:28.
Старый 13.07.2010, 17:27
Хемуль вне форума Посмотреть профиль Отправить личное сообщение для Хемуль Найти все сообщения от Хемуль
  № 2  
Ответить с цитированием
Хемуль
Квач
 
Аватар для Хемуль

Регистрация: Sep 2006
Адрес: Украина, Киев
Сообщений: 1,526
2 i.o.:
А зачем? о_0 Э... Противоречит, я думаю. Это как человеку родиться дважды, что противоречит божественному плану.
__________________
Да не нужно тебе читать документацию по Flash и AS от Adobe - ты слишком умён для этого

Старый 13.07.2010, 17:35
i.o. вне форума Посмотреть профиль Отправить личное сообщение для i.o. Найти все сообщения от i.o.
  № 3  
Ответить с цитированием
i.o.
 
Аватар для i.o.

Регистрация: Apr 2010
Адрес: Earth
Сообщений: 1,897
да, сморозил чушь. А ведь как на правду было похоже...
Просто стало интересно (с геттером и сеттером подобное работает) и сделал такой тест:
Код 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. Следовательно действительно получается вызвать повторно конструктор. Поправьте, если не прав.


Последний раз редактировалось i.o.; 13.07.2010 в 17:55.
Старый 13.07.2010, 18:07
Хемуль вне форума Посмотреть профиль Отправить личное сообщение для Хемуль Найти все сообщения от Хемуль
  № 4  
Ответить с цитированием
Хемуль
Квач
 
Аватар для Хемуль

Регистрация: Sep 2006
Адрес: Украина, Киев
Сообщений: 1,526
2 i.o.:
Ну, конструктор - это функция, которая вызывается после создания экземпляра класса. В ней обычно происходит инициализация чего-нибудь. Членов класса, например. Только вызывать конструктор несколько раз... как-то странно что ли... Да и ни к чему. Можно просто описать какую-нибудь публичную функцию init и выполнять её в конструкторе и так, как метод класса, без сохранения ссылок на конструктор.
__________________
Да не нужно тебе читать документацию по Flash и AS от Adobe - ты слишком умён для этого

Старый 13.07.2010, 18:11
i.o. вне форума Посмотреть профиль Отправить личное сообщение для i.o. Найти все сообщения от i.o.
  № 5  
Ответить с цитированием
i.o.
 
Аватар для i.o.

Регистрация: Apr 2010
Адрес: Earth
Сообщений: 1,897
Все бы ничего, да вот только super() можно вызывать только в конструкторе. Да и по задумке похоже, что это делать нужно только один раз, а тут выходит, что вызывай сколько влезет. Это баг или так и задумано?

Старый 13.07.2010, 18:14
BlooDHounD вне форума Посмотреть профиль Отправить личное сообщение для BlooDHounD Посетить домашнюю страницу BlooDHounD Найти все сообщения от BlooDHounD
  № 6  
Ответить с цитированием
BlooDHounD
стервочка (я мужик)
 
Аватар для BlooDHounD

блогер
Регистрация: Mar 2004
Адрес: Борисов
Сообщений: 3,161
Записей в блоге: 22
баг конечно.

Старый 13.07.2010, 18:18
i.o. вне форума Посмотреть профиль Отправить личное сообщение для i.o. Найти все сообщения от i.o.
  № 7  
Ответить с цитированием
i.o.
 
Аватар для i.o.

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


Последний раз редактировалось i.o.; 13.07.2010 в 18:36.
Старый 13.07.2010, 19:06
alexberkut вне форума Посмотреть профиль Отправить личное сообщение для alexberkut Найти все сообщения от alexberkut
  № 8  
Ответить с цитированием
alexberkut

Регистрация: Jun 2010
Адрес: Беларусь, Гродно
Сообщений: 58
а мне понравился аналог про родиться дважды...

Старый 13.07.2010, 19:39
i.o. вне форума Посмотреть профиль Отправить личное сообщение для i.o. Найти все сообщения от i.o.
  № 9  
Ответить с цитированием
i.o.
 
Аватар для i.o.

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

Создать новую тему Ответ Часовой пояс GMT +4, время: 12:05.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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