Показать сообщение отдельно
Старый 07.07.2011, 09:56
AirDecade вне форума Посмотреть профиль Отправить личное сообщение для AirDecade Найти все сообщения от AirDecade
  № 8  
Ответить с цитированием
AirDecade

Регистрация: Jun 2010
Сообщений: 15
Я провёл тестирование наследования static переменной. Результат: при большом желании она наследуется.
Вот проект под flashDevelop с примером: http://dl.************/u/8648712/inheritanceTest.rar
И вот непосредственно код:

Код AS3:
package 
{
	import flash.display.Bitmap;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.utils.getDefinitionByName;
	import flash.utils.getQualifiedClassName;
 
	public class Main extends Sprite 
	{		
		public function Main():void 
		{
			if (stage) init();
			else addEventListener(Event.ADDED_TO_STAGE, init);
		}
 
		private function init(e:Event = null):void 
		{
			removeEventListener(Event.ADDED_TO_STAGE, init);
			// entry point
 
			//Инициализируем static переменные с bitmapData детей через родителя
			Parent.initChild("Child1");
			Parent.initChild("Child2");
 
			//На данном этапе никто больше не меняет никакую bitmapData нигде.
			//Однако, как видно из работающей флешки, они разные для child1 и child2
 
			//Если бы static переменная из Parent не унаследовалась в child1 и child2
			//То там бы хранилась либо одна bitmapData, либо другая, но
			//как видно, bitmapData разные.
 
			//Да, всё это изврат.
			//Но это доказывает, что static переменная унаследовалась.
			//Или как ещё это трактовать?
 
			var child1:Child1 = new Child1();
			var child2:Child2 = new Child2();
 
			var sq:String;
			var cl:Class;
 
			trace(Parent.bitmapData);
 
			sq = getQualifiedClassName(child1);
			cl = getDefinitionByName(sq) as Class;
			var bitmap:Bitmap = new Bitmap(cl.bitmapData);
			trace(cl.bitmapData.height);
			addChild(bitmap);
 
			sq = getQualifiedClassName(child2);
			cl = getDefinitionByName(sq) as Class;			
			bitmap = new Bitmap(cl.bitmapData);
			trace(cl.bitmapData.height);
			bitmap.x = 100;
			addChild(bitmap);
		}		
	}	
}
Код AS3:
package 
{
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.utils.getDefinitionByName;
	public class  Parent
	{
		public static var bitmapData:BitmapData;			
 
		public static function initChild(name:String):void
		{
			var cl:Class = getDefinitionByName(name) as Class;
			var b:Bitmap = new cl["pic"]();
			cl.bitmapData = b.bitmapData;
		}
	}	
}
Код AS3:
package 
{
	import flash.display.BitmapData;
	public class  Child1 extends Parent
	{
		[Embed(source = '../lib/explosionDraftPlanet1.png')]
		public static var pic:Class;
 
		public function Child1():void{}
	}
}
Код AS3:
package 
{
	import flash.display.BitmapData;
	public class  Child2 extends Parent
	{
		[Embed(source = '../lib/ExpCloud1.png')]
		public static var pic:Class;
 
		public function Child2():void{}
	}	
}
Результаты трейса: null, 97, 40

Добавлено через 5 минут
Пытаясь разобраться с тем, что происходит, я пришёл к следующей теории:
static переменные не наследуются, а приведённый пример работает из-за того, что в результате всех этих махинаций с definitionByName и т.п. соответствующие поля были добавлены в классы-потомки, но изначально их там не было унаследовано.


Последний раз редактировалось iNils; 07.07.2011 в 11:49.