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

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

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

Регистрация: Jun 2010
Сообщений: 15
По умолчанию Обращение из родителя к унаследованной static переменной потомка

Есть класс-родитель и несколько унаследованных от него потомков.
Код AS3:
public class parent
{
    protected static var b:Bitmap;
    //...
 
    public static function setBitmap(_b:Bitmap):void
    {
        b = _b;
    }
}
Код AS3:
public class child1 extends parent
{
    //...
    public function foo(_b:Bitmap):void
    {
        //...
       setBitmap(_b);
    }
}
Код AS3:
public class child2 extends parent
{
    //...
    public function bar(_b:Bitmap):void
    {
        //...
       setBitmap(_b);
    }
}
В ходе работы классов потомков периодически нужно заносить в переменную b каждого класса потомка битмап. Для этого я вызываю общую для них всех (а потому написанную в классе-родителе) функцию setBitmap. Но она заносит битмап в static переменную родителя, а не класса-потомка, который её вызвал. А нужно именно в static переменную класса потомка.

Понятно, что это можно решить, скопировав функцию setBitmap в каждый класс-потомок вместо класса родителя. Но это не правильно. (я привёл упрощённый пример, на практике setBitmap содержит много кода, хотелось бы менять его из одного места, а не из 20).

Понятно, что можно использовать getQualifiedClassName в паре с getDefinitionByName, чтобы в родителе всё таки записать битмап в правильный класс. Но неужели нет более простого решения?


Последний раз редактировалось iNils; 07.07.2011 в 11:47.
Старый 07.07.2011, 07:12
goodguy вне форума Посмотреть профиль Найти все сообщения от goodguy
  № 2  
Ответить с цитированием
goodguy
Banned
[+1 05.11.11]
[+1 09.08.11]

Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
Цитата:
неужели нет более простого решения?
Есть. Отказаться от этой protected static переменной и, сделать ее public static, если уж на то пошло.
А вообще, лично я не вижу абсолютно никакого смысла во всех этих извращениях. Может поясните, зачем это нужно на практике?
Ведь обращение к статическим полям происходит в любом случае не через экземпляр класса


Последний раз редактировалось goodguy; 07.07.2011 в 07:15.
Старый 07.07.2011, 07:32
kackbip вне форума Посмотреть профиль Отправить личное сообщение для kackbip Найти все сообщения от kackbip
  № 3  
Ответить с цитированием
kackbip
 
Аватар для kackbip

Регистрация: Sep 2007
Адрес: Tomsk
Сообщений: 943
Отправить сообщение для kackbip с помощью ICQ Отправить сообщение для kackbip с помощью Skype™
Изврат полнейший. Уберите нафик static. Работайте с экземплярами.

Старый 07.07.2011, 07:43
BuKT вне форума Посмотреть профиль Отправить личное сообщение для BuKT Найти все сообщения от BuKT
  № 4  
Ответить с цитированием
BuKT
 
Аватар для BuKT

блогер
Регистрация: Dec 2010
Сообщений: 237
Записей в блоге: 5
А разве статические переменные наследуются?
__________________
Дебаггер не предлагать

Старый 07.07.2011, 08:10
goodguy вне форума Посмотреть профиль Найти все сообщения от goodguy
  № 5  
Ответить с цитированием
goodguy
Banned
[+1 05.11.11]
[+1 09.08.11]

Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
Конечно нет. Но обращение к ним может происходить в классах потомках напрямую

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

Регистрация: Jun 2010
Сообщений: 15
Цитата:
Сообщение от goodguy Посмотреть сообщение
Есть. Отказаться от этой protected static переменной и, сделать ее public static, если уж на то пошло.
А чем это поможет? Статическая функция родителя всё равно будет писать в свою статическую переменную, а не в переменную вызвавшего эту функцию потомка. Собственно, она и была public, я неправильно написал...

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

От родителя унаследовано много разных классов. Но функции, имеющие дело с данными, которые я пытаюсь хранить в static переменных, одинаковы для всех этих классов, поэтому хочется иметь их в родителе. (Только нужно чтоб эти функции брали данные из static перменных потомка, который их вызвал, а не родителя, где находится функция).

Что можно сделать:
1)
Цитата:
Сообщение от kackbip Посмотреть сообщение
Уберите нафик static. Работайте с экземплярами.
Тогда не будет вопросов с обращением именно к полям потомка в функции родителя. Но тогда надо будет инициализировать эти экземпляры как-то. И не один раз на старте программы, а при каждом создании экземпляра потомка. А для этого их нужно изначально где-то хранить. Таким образом, возвращаемся туда, откуда пришли - где же их хранить.

2) Извращаться с getQualifiedClassName и getDefinitionByName, чтобы понять какой именно потомок вызвал функцию и обратиться к его полям.

3) Сделать класс, который будет хранить все эти данные за потомков, потомки (или родитель - становиться не важно) просто обращаются к нему за ссылкой на данные, указывая в аргументе класс, от которого ему нужны данные. Он инкапсулирует все нюансы их инициализации, что я пытаюсь запихнуть в родителя.

Наверно, третий вариант и является "правильным".
Только в моём случае он более морочный. Больше придётся переделывать. Поэтому я выбрал второй.

Цитата:
Сообщение от BuKT Посмотреть сообщение
А разве статические переменные наследуются?
As a matter of fact - наследуются.

Добавлено через 2 минуты
Цитата:
Сообщение от goodguy Посмотреть сообщение
Конечно нет. Но обращение к ним может происходить в классах потомках напрямую
мм? 0_о А как тогда ещё назвать то, что они делают?
Классы потомки могут обращаться к родительским static, но у них остаются их собственные 'унаследованные' static.

Старый 07.07.2011, 09:54
goodguy вне форума Посмотреть профиль Найти все сообщения от goodguy
  № 7  
Ответить с цитированием
goodguy
Banned
[+1 05.11.11]
[+1 09.08.11]

Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
Цитата:
As a matter of fact - наследуются.
As a matter of fact - не наследуются.
Особенно, советую обратить внимание на то, что выделенно жирным шрифтом: Static properties not inherited
Цитата:
А чем это поможет? Статическая функция родителя всё равно будет писать в свою статическую переменную, а не в переменную вызвавшего эту функцию потомка. Собственно, она и была public, я неправильно написал...
Очевидно, надо изобрести другой способ выполнения этой задачи.

Старый 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.
Старый 07.07.2011, 10:02
goodguy вне форума Посмотреть профиль Найти все сообщения от goodguy
  № 9  
Ответить с цитированием
goodguy
Banned
[+1 05.11.11]
[+1 09.08.11]

Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
Цитата:
Я провёл тестирование наследования static переменной. Результат: при большом желании она наследуется.
Напишите об этом в адоби. Скажите им, что они дураки.

п.с. я не вижу в этом коде подтверждения того, что статичные переменный наследуются.

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

Регистрация: Jun 2010
Сообщений: 15
Цитата:
Сообщение от goodguy Посмотреть сообщение
Напишите об этом в адоби. Скажите им, что они дураки.
Ну, это вполне могло бы оказаться недокументированной фичей.

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

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

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


 


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


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