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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 15.05.2012, 23:11
Maestro13 вне форума Посмотреть профиль Отправить личное сообщение для Maestro13 Найти все сообщения от Maestro13
  № 1  
Ответить с цитированием
Maestro13

Регистрация: May 2009
Адрес: Санкт-Петербург
Сообщений: 79
По умолчанию Проблема с инициализацией переменной

переменная a:boolean = false определена в классе class_parent. Конструктор класса class_child расширяющий class_parent:
a = true;
super();
так вот. трейс после конструктора показывает true

хотя, если я не ошибаюсь при вызове конструктора суперкласса происходит инициализация прееменных супер класса. Тоесть переменная должна переопределиться в false.

Если я ошибаюсь, объясните как происходит порядок инициализации, или дайте ссылку, где об этом можно почитать

Старый 15.05.2012, 23:33
silin вне форума Посмотреть профиль Посетить домашнюю страницу silin Найти все сообщения от silin
  № 2  
Ответить с цитированием
silin
 
Аватар для silin

блогер
Регистрация: Mar 2003
Адрес: Моск. обл.
Сообщений: 5,269
Записей в блоге: 6
Код AS3:
public class Parent 
{
	public var a:Boolean = false;
	trace("Parent: init members");
	public function Parent() 
	{
		trace( "Parent: ctor" );
 
	}
 
}
Код AS3:
public class Child extends Parent 
{
	trace("Child: init members");
	public function Child() 
	{
		trace( "Child: ctor" );
		super();
 
	}
}
Код AS3:
var test:Child = new Child();
/*
Parent: init members
Child: init members
Child: ctor
Parent: ctor
*/

Старый 16.05.2012, 00:20
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 3  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Цитата:
Код AS3:
public class Parent 
{
	public var a:Boolean = false;
	trace("Parent: init members");
	public function Parent() 
	{
		trace( "Parent: ctor" );
 
	}
}
@silin
trace("Parent: init members"); будет вызвано 1 раз, сколько бы экземпляров не создавали. Т.е. это статическая инициализация, не уверен, что это корректная демонстрация порядка инициализации _нестатических_ переменных

Попробуем выкрутиться:
Код AS3:
class A {
	protected var a:Bool = new Bool(false);
	public function A() {
		trace("A {");
		trace("a: " + a);
		trace("}");
	}		
}
class B extends A {		
	public function B() {
		trace("B {");
		trace("Выполняем a = new Bool(true):");
		a = new Bool(true);
		trace("Выполняем super():");
		super();
		trace("a: " + a);
		trace("}");
	}
}
class Bool {	
	private var _value:Boolean;
	public function Bool(value:Boolean) {
		_value = value;
		trace("new Bool(" + value + ")");
	}
	public function toString():String {
		return "[Bool(" + _value + ")]";
	}
}
/*
B {
Выполняем a = new Bool(true):
new Bool(true)
Выполняем super():
new Bool(false)
A {
a: [Bool(false)]
}
a: [Bool(false)]-????????
}
*/
Выводит таки false?

Так, а если просто Boolean?
Код AS3:
class A {
	protected var a:Boolean = false;
	public function A() {
		trace("A {");
		trace("a: " + a);
		trace("}");
	}		
}
class B extends A {		
	public function B() {
		trace("B {");
		trace("Выполняем a = new Bool(true):");
		a = true;
		trace("Выполняем super():");
		super();
		trace("a: " + a);
		trace("}");
	}
}
/*
B {
Выполняем a = new Bool(true):
Выполняем super():
A {
a: true
}
a: true 0_o
}
*/
Теперь уже я ничего не понимаю


Последний раз редактировалось expl; 16.05.2012 в 00:44.
Старый 16.05.2012, 00:28
Maestro13 вне форума Посмотреть профиль Отправить личное сообщение для Maestro13 Найти все сообщения от Maestro13
  № 4  
Ответить с цитированием
Maestro13

Регистрация: May 2009
Адрес: Санкт-Петербург
Сообщений: 79
Вот такой пример:
Код AS3:
package  
{
 
	public class A 
	{
		protected var t:Boolean = true;
		trace("A init");
		public function A() 
		{
			trace("A constr",t);
		}
 
	}
 
}

Код AS3:
package  
{
 
	public class B extends A 
	{
		trace("B init");
		public function B() 
		{
			t = false;
			trace("B constr",t);
			super();
		}
 
	}
 
}


Код AS3:
var b:B=new B();
Результат такой:
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

Почему в одном случае она переопределяется, а в другом нет?

Старый 16.05.2012, 00:50
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 5  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Может после super() установить нужное значение и забить?
А нужное самому суперклассу загнать в конструктор?

Но лучше, конечно, перед этим в документации поискать порядок инициализации полей, а то так и останется загадкой (мне это делать сейчас лень запрещает)

Старый 16.05.2012, 02:29
Партизан вне форума Посмотреть профиль Отправить личное сообщение для Партизан Найти все сообщения от Партизан
  № 6  
Ответить с цитированием
Партизан
 
Аватар для Партизан

блогер
Регистрация: Nov 2007
Адрес: Almaty, Moscow
Сообщений: 396
Записей в блоге: 5
Отправить сообщение для Партизан с помощью Skype™
Думаю, при инициализации переменных берется только класс переменной из родительского. Для Boolean значение по умолчанию 'false'. После вызова родительского конструктора, переменной задается значение, если значение задано до вызова super(), то значение родительского класса игнорируется(что логично в общем-то). Если super() не вызывается в конструкторе, компилятор добавляет его в первую инструкцию конструктора наследника.

Код AS3:
public class A 
	{
		protected var a:String = 'from A';
		trace('init A');
 
		public function A() 
		{
			trace('cnt A');
			a = 'from cnt A';
 
		}
 
	}
 
public class B extends A
	{
		trace('init B')
		public function B() 
		{
			trace('cnt B, set a, a=', a);
			a = 'cnt B'
			trace('a from B cnt, a=', a);
			super();			
		}
 
	}
 
var b:B = new B();
trace('')
var c:B = new B();
 
/*
init A
init B
cnt B, set a, a= null
a from B cnt, a= cnt B
cnt A
 
cnt B, set a, a= null
a from B cnt, a= cnt B
cnt A
*/

Старый 16.05.2012, 04:34
Gaen вне форума Посмотреть профиль Отправить личное сообщение для Gaen Найти все сообщения от Gaen
  № 7  
Ответить с цитированием
Gaen
strange mood
 
Аватар для Gaen

модератор форума
Регистрация: Jul 2004
Адрес: Питер
Сообщений: 1,653
Записей в блоге: 1
Отправить сообщение для Gaen с помощью ICQ Отправить сообщение для Gaen с помощью Skype™
Именно поэтому я инициализирую переменные в конструкторе.
__________________
тонкий тролль, осеянный благодатью

Старый 16.05.2012, 04:45
Партизан вне форума Посмотреть профиль Отправить личное сообщение для Партизан Найти все сообщения от Партизан
  № 8  
Ответить с цитированием
Партизан
 
Аватар для Партизан

блогер
Регистрация: Nov 2007
Адрес: Almaty, Moscow
Сообщений: 396
Записей в блоге: 5
Отправить сообщение для Партизан с помощью Skype™
А вот *** там.... Сорри ввел в некоторое заблуждение.
Родительский конструктор изменяет переменную даже после ее "переопределения" в потомке. Если трейсануть после super() в B классе, результатом будет:
Код:
cnt A
from cnt A
нДА.... Действительно непредсказуемо
Adobe: В противном случае ссылка super может повести себя не так, как предполагалось. пусть и про ссылку, но по теме.

Старый 16.05.2012, 11:02
silin вне форума Посмотреть профиль Посетить домашнюю страницу silin Найти все сообщения от silin
  № 9  
Ответить с цитированием
silin
 
Аватар для silin

блогер
Регистрация: Mar 2003
Адрес: Моск. обл.
Сообщений: 5,269
Записей в блоге: 6
>> Почему в одном случае она переопределяется, а в другом нет? (пост #4)
такое есть предположение: инициализация дефолтовым значением (false в этом случае) просто опускается, ну и не переопределяется ничего
вот и для целых такая же картина
Код AS3:
public class A
{
	protected var n:int = 0;// на любое другое(кроме дефолтового нуля) поменяет
	public function A()
	{
		trace("A constr", n);
	}
}
Код AS3:
public class B extends A 
{
	public function B() 
	{
		n = 1;
		trace("B constr",n);
		super();
	}
}
имо, не стоит играться с этими вещами, во избежание таких фокусов, короче super в самый вверх и все будет строго, ага

Добавлено через 18 минут
или как вариант инициализировать так чтоб компилятор 'не знал' чем и не своевольничал, типа
Код AS3:
public class A
{
	protected var t:Boolean = initProp();
 
	public function A()
	{
		trace("A constr", t);
	}
	private function initProp():Boolean
	{
		return false;
	}
}
только опять же: а оно вам надо?

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

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

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


 


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


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