|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
Регистрация: Jun 2010
Сообщений: 15
|
Обращение из родителя к унаследованной static переменной потомка
Есть класс-родитель и несколько унаследованных от него потомков.
public class parent { protected static var b:Bitmap; //... public static function setBitmap(_b:Bitmap):void { b = _b; } } public class child1 extends parent { //... public function foo(_b:Bitmap):void { //... setBitmap(_b); } } public class child2 extends parent { //... public function bar(_b:Bitmap):void { //... setBitmap(_b); } } Понятно, что это можно решить, скопировав функцию setBitmap в каждый класс-потомок вместо класса родителя. Но это не правильно. (я привёл упрощённый пример, на практике setBitmap содержит много кода, хотелось бы менять его из одного места, а не из 20). Понятно, что можно использовать getQualifiedClassName в паре с getDefinitionByName, чтобы в родителе всё таки записать битмап в правильный класс. Но неужели нет более простого решения? Последний раз редактировалось iNils; 07.07.2011 в 11:47. |
|
|||||
Banned
[+1 05.11.11]
[+1 09.08.11] Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
|
Цитата:
А вообще, лично я не вижу абсолютно никакого смысла во всех этих извращениях. Может поясните, зачем это нужно на практике? Ведь обращение к статическим полям происходит в любом случае не через экземпляр класса Последний раз редактировалось goodguy; 07.07.2011 в 07:15. |
|
|||||
Изврат полнейший. Уберите нафик static. Работайте с экземплярами.
|
|
|||||
Banned
[+1 05.11.11]
[+1 09.08.11] Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
|
Конечно нет. Но обращение к ним может происходить в классах потомках напрямую
|
|
|||||
Регистрация: Jun 2010
Сообщений: 15
|
Цитата:
Попробую объяснить для чего это, но сразу оговорюсь, я создал тему, потому что мне интересен хороший метод обращения к унаследованному static полю из родителя, а не способ решения проблемы, которую я сейчас ниже опишу. От родителя унаследовано много разных классов. Но функции, имеющие дело с данными, которые я пытаюсь хранить в static переменных, одинаковы для всех этих классов, поэтому хочется иметь их в родителе. (Только нужно чтоб эти функции брали данные из static перменных потомка, который их вызвал, а не родителя, где находится функция). Что можно сделать: 1) Тогда не будет вопросов с обращением именно к полям потомка в функции родителя. Но тогда надо будет инициализировать эти экземпляры как-то. И не один раз на старте программы, а при каждом создании экземпляра потомка. А для этого их нужно изначально где-то хранить. Таким образом, возвращаемся туда, откуда пришли - где же их хранить. 2) Извращаться с getQualifiedClassName и getDefinitionByName, чтобы понять какой именно потомок вызвал функцию и обратиться к его полям. 3) Сделать класс, который будет хранить все эти данные за потомков, потомки (или родитель - становиться не важно) просто обращаются к нему за ссылкой на данные, указывая в аргументе класс, от которого ему нужны данные. Он инкапсулирует все нюансы их инициализации, что я пытаюсь запихнуть в родителя. Наверно, третий вариант и является "правильным". Только в моём случае он более морочный. Больше придётся переделывать. Поэтому я выбрал второй. As a matter of fact - наследуются. Добавлено через 2 минуты Цитата:
Классы потомки могут обращаться к родительским static, но у них остаются их собственные 'унаследованные' static. |
|
|||||
Banned
[+1 05.11.11]
[+1 09.08.11] Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
|
Цитата:
Особенно, советую обратить внимание на то, что выделенно жирным шрифтом: Static properties not inherited Цитата:
|
|
|||||
Регистрация: Jun 2010
Сообщений: 15
|
Я провёл тестирование наследования static переменной. Результат: при большом желании она наследуется.
Вот проект под flashDevelop с примером: http://dl.************/u/8648712/inheritanceTest.rar И вот непосредственно код: 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); } } } 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; } } } package { import flash.display.BitmapData; public class Child1 extends Parent { [Embed(source = '../lib/explosionDraftPlanet1.png')] public static var pic:Class; public function Child1():void{} } } package { import flash.display.BitmapData; public class Child2 extends Parent { [Embed(source = '../lib/ExpCloud1.png')] public static var pic:Class; public function Child2():void{} } } Добавлено через 5 минут Пытаясь разобраться с тем, что происходит, я пришёл к следующей теории: static переменные не наследуются, а приведённый пример работает из-за того, что в результате всех этих махинаций с definitionByName и т.п. соответствующие поля были добавлены в классы-потомки, но изначально их там не было унаследовано. Последний раз редактировалось iNils; 07.07.2011 в 11:49. |
|
|||||
Banned
[+1 05.11.11]
[+1 09.08.11] Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
|
Цитата:
п.с. я не вижу в этом коде подтверждения того, что статичные переменный наследуются. |
|
|||||
Регистрация: Jun 2010
Сообщений: 15
|
Ну, это вполне могло бы оказаться недокументированной фичей.
|
Часовой пояс GMT +4, время: 07:33. |
|
« Предыдущая тема | Следующая тема » |
|
|