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

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

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

Регистрация: May 2010
Адрес: Ногинск
Сообщений: 56
По умолчанию Вопрос о наследовании статических переменных

Столкнулся с загадкой, связанной с наследованием в AS3. В базовом классе объявлена защищенная статическая переменная:
Код AS3:
public dynamic class View extends Sprite {
	...
	public static const LANG_RU:String = 'ru';
	public static const LANG_EN:String = 'en';
 
	protected static var _lang:String;
 
	static public function get lang():String 
	{
		return _lang;
	}
 
	static public function set lang(value:String):void 
	{
		_lang = value;
	}
	...
}
Задаем ей значение:
Код AS3:
View.lang = View.LANG_RU;
Пробую обратиться к ней в дочернем классе (наследуется непосредственно от View) без уточнения объекта:
Код AS3:
trace(_lang);
Значение выводится.

Но при этом если обратиться к ней как this._lang или super._lang - получаем undefined.

В связи с этим возникает вопрос: как наследуются статические переменные?

Старый 29.03.2012, 15:21
illuzor вне форума Посмотреть профиль Отправить личное сообщение для illuzor Найти все сообщения от illuzor
  № 2  
Ответить с цитированием
illuzor
 
Аватар для illuzor

Регистрация: Dec 2010
Адрес: Ярославль
Сообщений: 1,255
У статических переменных нет this. Они принадлежат классу, а не экземпляру.

Старый 29.03.2012, 15:23
Genzo вне форума Посмотреть профиль Отправить личное сообщение для Genzo Посетить домашнюю страницу Genzo Найти все сообщения от Genzo
  № 3  
Ответить с цитированием
Genzo
 
Аватар для Genzo

блогер
Регистрация: Feb 2010
Адрес: MSK
Сообщений: 859
Записей в блоге: 3
Отправить сообщение для Genzo с помощью ICQ Отправить сообщение для Genzo с помощью Skype™
Цитата:
Но при этом если обратиться к ней как this._lang или super._lang - получаем undefined.
this и super - ссылки на экземпляры текущего / родительского класса, а статическая переменная не является членом экземпляра, а является членом самого класса, обращайтесь к ней так-же как и в родительском классе.
Код AS3:
View.lang
ClassExtendsView.lang
__________________
Gamedev != Gaming (http://twitter.com/#!/GenzoDev). Don't forget to [+] if it works.

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

Регистрация: May 2010
Адрес: Ногинск
Сообщений: 56
Цитата:
Сообщение от Genzo Посмотреть сообщение
this и super - ссылки на экземпляры текущего / родительского класса, а статическая переменная не является членом экземпляра, а является членом самого класса, обращайтесь к ней так-же как и в родительском классе.
Код AS3:
View.lang
ClassExtendsView.lang
Да, точно. Я как-то забылся ) Должно быть, меня смутило обращение через точку к статической переменной - я слишком привык к PHP.

А есть вариант для обращения к статическим переменным класса вроде self в PHP?

Старый 29.03.2012, 15:29
Aquahawk вне форума Посмотреть профиль Отправить личное сообщение для Aquahawk Посетить домашнюю страницу Aquahawk Найти все сообщения от Aquahawk
  № 5  
Ответить с цитированием
Aquahawk
 
Аватар для Aquahawk

Регистрация: Nov 2010
Адрес: Москва
Сообщений: 915
Записей в блоге: 4
Отправить сообщение для Aquahawk с помощью ICQ Отправить сообщение для Aquahawk с помощью Skype™
статические переменные не наследуются. На в AS3 ни в C++ ни в одном из известных мне языков, кроме php, но эту ересь я стараюсь обходить за километр.

Добавлено через 43 секунды
Цитата:
я слишком привык к PHP
Ага! ну вот и оствет. Прошу прощения за резкое высказывание выше.
__________________
:)

Старый 29.03.2012, 15:31
Genzo вне форума Посмотреть профиль Отправить личное сообщение для Genzo Посетить домашнюю страницу Genzo Найти все сообщения от Genzo
  № 6  
Ответить с цитированием
Genzo
 
Аватар для Genzo

блогер
Регистрация: Feb 2010
Адрес: MSK
Сообщений: 859
Записей в блоге: 3
Отправить сообщение для Genzo с помощью ICQ Отправить сообщение для Genzo с помощью Skype™
Цитата:
А есть вариант для обращения к статическим переменным класса вроде self в PHP?
К сожалению нет.
Можно конечно извратиться, но все равно придется указывать название класса, да и не нужно :
Код AS3:
(this.constructor as ClassName).STATIC_VAR === ClassName.STATIC_VAR
__________________
Gamedev != Gaming (http://twitter.com/#!/GenzoDev). Don't forget to [+] if it works.

Старый 29.03.2012, 15:34
Aquahawk вне форума Посмотреть профиль Отправить личное сообщение для Aquahawk Посетить домашнюю страницу Aquahawk Найти все сообщения от Aquahawk
  № 7  
Ответить с цитированием
Aquahawk
 
Аватар для Aquahawk

Регистрация: Nov 2010
Адрес: Москва
Сообщений: 915
Записей в блоге: 4
Отправить сообщение для Aquahawk с помощью ICQ Отправить сообщение для Aquahawk с помощью Skype™
Можно ещё сильнее извратится. Можно взять от себя describeType и проехаться по всей цепочке наследования и получая ссылки на сами классы предки через getDefenitionByName дёргать у них эту статику. Т.е. теоретически можно сделать что-то типа прототипного наследования, и искать свойство в цепочке предков. Но я не вижу смысла так делать.
__________________
:)

Старый 29.03.2012, 15:35
Genzo вне форума Посмотреть профиль Отправить личное сообщение для Genzo Посетить домашнюю страницу Genzo Найти все сообщения от Genzo
  № 8  
Ответить с цитированием
Genzo
 
Аватар для Genzo

блогер
Регистрация: Feb 2010
Адрес: MSK
Сообщений: 859
Записей в блоге: 3
Отправить сообщение для Genzo с помощью ICQ Отправить сообщение для Genzo с помощью Skype™
Код AS3:
class Users { 
	private static var numInstances:Number = 0; 
	function Users() { 
		numInstances++; 
	} 
	static function get instances():Number { 
		return numInstances; 
	} 
}
class PowerUsers extends Users{
    function PowerUsers() {
        instances++;  // unqualified reference to static property Users.instances is legal
    }
}
 
trace(PowerUsers.instances); // error, cannot access static property using PowerUsers class
Цитата:
Статические члены класса не наследуются. Невозможно сослаться на статический член класса, используя имя подкласса, что возможно в Java или C++. Однако можно сослаться на статическую переменную или статический метод в пределах класса или подкласса без использования квалификатора. См. пример ниже.
__________________
Gamedev != Gaming (http://twitter.com/#!/GenzoDev). Don't forget to [+] if it works.

Старый 29.03.2012, 15:53
Mirror13 вне форума Посмотреть профиль Отправить личное сообщение для Mirror13 Найти все сообщения от Mirror13
  № 9  
Ответить с цитированием
Mirror13
 
Аватар для Mirror13

Регистрация: May 2010
Адрес: Ногинск
Сообщений: 56
Ясно, спасибо за ответ. Наверно, наиболее оптимально обращаться без квалификатора либо с именем родительского класса.

Старый 29.03.2012, 16:01
Aquahawk вне форума Посмотреть профиль Отправить личное сообщение для Aquahawk Посетить домашнюю страницу Aquahawk Найти все сообщения от Aquahawk
  № 10  
Ответить с цитированием
Aquahawk
 
Аватар для Aquahawk

Регистрация: Nov 2010
Адрес: Москва
Сообщений: 915
Записей в блоге: 4
Отправить сообщение для Aquahawk с помощью ICQ Отправить сообщение для Aquahawk с помощью Skype™
возможно выше я написал некоторое количество бреда. Позже ещё раз пробегусь по этому вопросу и проверю кое что.
__________________
:)

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

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

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


 


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


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