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

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

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

Регистрация: Nov 2007
Сообщений: 183
По умолчанию Создание объект в зависимости от объекта данных

Всем здравствуйте! Мне на ум ничего толкового не приходит. может кто подскажет как грамотно сделать.
Попробую объяснить. Есть некий массив данных
Допустим такой:

Код AS3:
var dataList:Array = [ShapeData1,ShapeData2,ShapeData3,...,ShapeData2]
Все они наследуются от ShapeData

Нужна функция, которая возвращает определенный объект Shape в зависимости от типа DataShape

я написал вот такую:
Код AS3:
public static function getShapeByData(_data : ShapeData) : Shape {					
 
 
		if(_data as ShapeData1) return new Shape1(_data);
 
		if(_data as ShapeData2) return new Shape2(_data);
 
                 if(_data as ShapeData3) return new Shape3(_data);
 
		.......................................		
 
 
		return new Shape(_data);
	}
Но честно говоря не очень как то. Проблема в том, что если допустим Shape3 наследуется от Shape2 - который в свою очередь наследуется от Shape, то в данной функции Shape3 мне не видать как своих ушей, до тех пор пока к примеру я не помещу условие проверки Shape3 выше


Как бы четко определить, что некая ShapeData именно ShapeData1 или ShapeData3, независимо от их порядка проверки в функции (не зависимо от их наследования).

Или еще может какой выход есть. Я перелопатил весь форум, нашел только

getQualifiedSuperclassName(value:*):String

но он название класса с пекеджем выдает. Это нужно получается еще эту строку обрезать от него, что бы к примеру создать в зависимости от названии ShapeData
Если конечно нет другого выхода, наверно так сделаю.

Старый 22.02.2011, 20:13
i.o. вне форума Посмотреть профиль Отправить личное сообщение для i.o. Найти все сообщения от i.o.
  № 2  
Ответить с цитированием
i.o.
 
Аватар для i.o.

Регистрация: Apr 2010
Адрес: Earth
Сообщений: 1,897
я так понимаю речь идет о:
Код AS3:
public static function cloneShapeData( shapeData:ShapeData ):Shape
{
    return (new (shapeData as Object).constructor( shapeData )) as Shape;
}
Правильно вас понял?
Если да, то лучше заведите метод clone() в классе ShapeData, а в наследуемых переопределяйте его

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

Регистрация: Nov 2007
Сообщений: 183
Если честно, не понял. Запись мудреная.

Добавлено через 1 час 14 минут
И где вот эта функция должна быть написана:
Код AS3:
public static function cloneShapeData( shapeData:ShapeData ):Shape
{
    return (new (shapeData as Object).constructor( shapeData )) as Shape;
}
Если в самой ShapeData и далее в дочерних переписана, то можно было бы и проще.
Что то типа:
Код AS3:
public static function getShape():Shape{
    return new Shape(this)
}
Но я не хотел что бы ShapeData еще заведовала тем, что создовала какой то конкретный объект


Последний раз редактировалось Doctor76; 22.02.2011 в 21:36.
Старый 22.02.2011, 23:25
ChuwY вне форума Посмотреть профиль Отправить личное сообщение для ChuwY Посетить домашнюю страницу ChuwY Найти все сообщения от ChuwY
  № 4  
Ответить с цитированием
ChuwY
 
Аватар для ChuwY

Регистрация: Nov 2009
Адрес: Тула / Москва
Сообщений: 734
Отправить сообщение для ChuwY с помощью ICQ Отправить сообщение для ChuwY с помощью Skype™
Код AS3:
package  {
  import flash.display.MovieClip;
  import flash.utils.setInterval;
 
  public class Main extends MovieClip {
    public function Main() {
      setInterval(sortShapes, 100);
    }
 
    public function sortShapes():void{
      var shapeData : ShapeData = getRandomShapeData(); 
      switch(shapeData.getClass()){
        case ShapeData:
	  trace("this is ShapeData!");
 	  break;
	case ShapeData2:
	  trace("this is ShapeData2!");
	  break;
	case ShapeData3:
	  trace("this is ShapeData3!");
	  break;
	}
    }
 
 
      public function getRandomShapeData():ShapeData{
        var classes : Array = [ShapeData, ShapeData2, ShapeData3];
        var classIdx : int = Math.random()*classes.length;
        return new classes[classIdx];
      }
  }
}
Код AS3:
package {
 
	import flash.utils.getQualifiedClassName;
	import flash.display.Sprite;
	import flash.utils.getDefinitionByName;
 
	public class ShapeData extends Sprite {
		public function ShapeData() {
 
		}
 
		public function getClass():Class {
			return getDefinitionByName(getQualifiedClassName(this)) as Class;
		}
	}
 
}

Код AS3:
package  {
 
	public class ShapeData2 extends ShapeData {
 
		public function ShapeData2() {
			// constructor code
		}
 
	}
 
}

Код AS3:
package  {
 
	public class ShapeData3 extends ShapeData{
 
		public function ShapeData3() {
			// constructor code
		}
 
	}
 
}
__________________
9 из 10 голосов в моей голове сказали наркотикам "НЕТ"
Мои ачивки: художник-паразит.

Старый 23.02.2011, 00:00
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 5  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Код AS3:
if ( (_data as Object).constructor === ShapeData1 ) return new Shape1(_data);
__________________
Reality.getBounds(this);

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

Регистрация: Nov 2009
Адрес: Тула / Москва
Сообщений: 734
Отправить сообщение для ChuwY с помощью ICQ Отправить сообщение для ChuwY с помощью Skype™
Wolsh-овский метод, кроме того, что проще, так еще и быстрее на ~11%

Прошу извинить за нубство и пользоваться им.
__________________
9 из 10 голосов в моей голове сказали наркотикам "НЕТ"
Мои ачивки: художник-паразит.

Старый 24.02.2011, 11:28
Doctor76 вне форума Посмотреть профиль Отправить личное сообщение для Doctor76 Найти все сообщения от Doctor76
  № 7  
Ответить с цитированием
Doctor76
 
Аватар для Doctor76

Регистрация: Nov 2007
Сообщений: 183
Спасибо всем за помощь.

Wolsh-овский метод работает!


Последний раз редактировалось Doctor76; 24.02.2011 в 11:43.
Старый 24.02.2011, 12:56
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 8  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
ChuwY, ого, getDefinitionByName + getQualifiedClassName — это по-самурайски.

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

Регистрация: Nov 2009
Адрес: Тула / Москва
Сообщений: 734
Отправить сообщение для ChuwY с помощью ICQ Отправить сообщение для ChuwY с помощью Skype™
Вырезать гланды через уши -- наш метод =D

Я был пьян и было ночь. Я и так краснею. Не надо больше пинать морально =D
__________________
9 из 10 голосов в моей голове сказали наркотикам "НЕТ"
Мои ачивки: художник-паразит.

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

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

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


 


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


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