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

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

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

Регистрация: May 2011
Сообщений: 76
По умолчанию еще один баг...

Может мне кто-то пояснить что я делаю неправильно? Или я наткнулся на очередной баг флеша?
как обычно, для наглядности приведу код:
Код AS3:
package test
{
    public class SendMessage
    {
        public static const TITLE_ID:uint = 2;
    }
}
 
package test
{
    public class ForwardMessage
    {
        public static const TITLE_ID:uint = 7;
    }
}
 
package test
{
    public class MessageController
    {
		private var messageClass:Class;
 
        public function init(messageType:Class):void
        {
			messageClass = messageType;
        }
 
		//Не работает. titleId всегда 0.
		public function getTitleId():uint
		{
			var titleId:uint = messageClass.TITLE_ID;
			return titleId;
		}
 
 
		// Тоже не работает(Ни одно из условий не удовлетворяется), догадываюсь почему, нохотелось бы услышать правильный ответ.
		public function getTitleId1():uint
		{
			var titleId:uint = 666;
			if(messageClass is SendMessage)
			{
				titleId = SendMessage.TITLE_ID;
			}
			else if(messageClass is ForwardMessage)
			{
				titleId = ForwardMessage.TITLE_ID;
			}
			return titleId;
		}
 
		//Работает.
		public function getTitleId2():uint
		{
			var titleId:uint = 666;
			if(messageClass == SendMessage)
			{
				titleId = SendMessage.TITLE_ID;
			}
			else if(messageClass == ForwardMessage)
			{
				titleId = ForwardMessage.TITLE_ID;
			}
			return titleId;
		}
 
    }
}
 
package test
{
    import test.SendMessage;
    import test.ForwardMessage;
 
    public class Main
    {
 
 
        public function Main()
        {
			var control:MessageController = new MessageController();
			control.init(SendMessage);
			trace(control.getTitleId());  // 0
			trace(control.getTitleId1()); // 666
			trace(control.getTitleId2()); // 2
			control.init(WriteMessage);
			trace(control.getTitleId());  // 0
			trace(control.getTitleId1()); // 666
			trace(control.getTitleId2()); // 7
        }
    }
}
Вопрос, как написать правильно что бы не нужно было использовать ифы(работал getTitleId() метод).

Старый 04.08.2013, 17:55
maincode вне форума Посмотреть профиль Отправить личное сообщение для maincode Посетить домашнюю страницу maincode Найти все сообщения от maincode
  № 2  
Ответить с цитированием
maincode

Регистрация: Feb 2010
Адрес: Город суеты
Сообщений: 191
Код AS3:
//Не работает. titleId всегда 0.
public function getTitleId():uint
{
	var titleId:uint = messageClass.TITLE_ID;
	return titleId;
}
Здесь у меня выдает нормальное значение, попробуйте так messageClass["TITLE_ID"]. И какой компилятор используете ?


Код AS3:
if(messageClass is SendMessage)
Т.к. messageClass у вас это сам класс поэтому данная конструкция не возвращает true, is покажет true в том случае, если messageClass будет экземпляром класса SendMessage, т.е. если написать так:
Код AS3:
var message:SendMessage = new SendMessage();
if (message is SendMessage) {
   // true
}
Или так:
Код AS3:
var message:* = new messageClass();
if (message is SendMessage) {
   // true
}
__________________
FlashPress.ru | Blog

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

блогер
Регистрация: Mar 2007
Сообщений: 1,291
Записей в блоге: 5
Отправить сообщение для cleptoman с помощью ICQ
Код AS3:
private const HASH:Dictionary = new Dictionary();
...
в констуркторе

Код AS3:
HASH[SendMessage] = SendMessage.TITLE_ID;
HASH[ForwardMessage] = ForwardMessage.TITLE_ID;
...

Код AS3:
public function getTitleId2():uint{
 return HASH[messageClass] || 666;
}
Добавлено через 2 минуты
небольшая поправочка...с нулем может последняя конструкция некорректно сработать. т.е. если ожидается нуль как возвращаемое значение..так просто его не дождетесь
__________________
http://cleptoman.free-lance.ru
achivements: дважды благословлен на воровство. осеяный благодатью

Старый 05.08.2013, 12:53
AlexLucas вне форума Посмотреть профиль Отправить личное сообщение для AlexLucas Найти все сообщения от AlexLucas
  № 4  
Ответить с цитированием
AlexLucas
[+1 05.11.12]
 
Аватар для AlexLucas

Регистрация: Feb 2011
Сообщений: 431
У меня всё работает. Вы где-то опечатались. У вас в примере сначала ForwardMessage, а в Main вызывается WriteMessage.
messageClass не кастуется к другому классу потому что они все типа Class.
Код AS3:
messageClass is Class //даст true
__________________
Oomph

Старый 06.08.2013, 13:25
searinox вне форума Посмотреть профиль Отправить личное сообщение для searinox Найти все сообщения от searinox
  № 5  
Ответить с цитированием
searinox

Регистрация: May 2011
Сообщений: 76
Цитата:
Сообщение от maincode Посмотреть сообщение
Код AS3:
//Не работает. titleId всегда 0.
public function getTitleId():uint
{
	var titleId:uint = messageClass.TITLE_ID;
	return titleId;
}
Здесь у меня выдает нормальное значение, попробуйте так messageClass["TITLE_ID"]. И какой компилятор используете ?


Код AS3:
if(messageClass is SendMessage)
Т.к. messageClass у вас это сам класс поэтому данная конструкция не возвращает true, is покажет true в том случае, если messageClass будет экземпляром класса SendMessage, т.е. если написать так:
Код AS3:
var message:SendMessage = new SendMessage();
if (message is SendMessage) {
   // true
}
Или так:
Код AS3:
var message:* = new messageClass();
if (message is SendMessage) {
   // true
}
Использую обычный флекс 4.1 компайлер. Как ни крути но не получается получить что-то отличное от 0 в 1 методе.
На счет Дикшионари - мне совершенно не подходит.

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

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

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


 


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


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