Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Создание объект в зависимости от объекта данных (http://www.flasher.ru/forum/showthread.php?t=151108)

Doctor76 22.02.2011 19:52

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

Код 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
Если конечно нет другого выхода, наверно так сделаю.

i.o. 22.02.2011 20:13

я так понимаю речь идет о:
Код AS3:

public static function cloneShapeData( shapeData:ShapeData ):Shape
{
    return (new (shapeData as Object).constructor( shapeData )) as Shape;
}

Правильно вас понял?
Если да, то лучше заведите метод clone() в классе ShapeData, а в наследуемых переопределяйте его

Doctor76 22.02.2011 20:25

Если честно, не понял. Запись мудреная.

Добавлено через 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 еще заведовала тем, что создовала какой то конкретный объект

ChuwY 22.02.2011 23:25

Код 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
                }
 
        }
 
}


Wolsh 23.02.2011 00:00

Код AS3:

if ( (_data as Object).constructor === ShapeData1 ) return new Shape1(_data);


ChuwY 23.02.2011 01:15

Wolsh-овский метод, кроме того, что проще, так еще и быстрее на ~11%

Прошу извинить за нубство и пользоваться им.

Doctor76 24.02.2011 11:28

Спасибо всем за помощь.

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

etc 24.02.2011 12:56

ChuwY, ого, getDefinitionByName + getQualifiedClassName — это по-самурайски.

ChuwY 24.02.2011 16:32

Вырезать гланды через уши -- наш метод =D

Я был пьян и было ночь. Я и так краснею. Не надо больше пинать морально =D


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

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