Я провёл тестирование наследования 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 и т.п. соответствующие поля были добавлены в классы-потомки, но изначально их там не было унаследовано.