PDA

Просмотр полной версии : Создание объект в зависимости от объекта данных


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


var dataList:Array = [ShapeData1,ShapeData2,ShapeData3,...,ShapeData2]



Все они наследуются от ShapeData

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

я написал вот такую:

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
я так понимаю речь идет о:

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 минут
И где вот эта функция должна быть написана:

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


Если в самой ShapeData и далее в дочерних переписана, то можно было бы и проще.
Что то типа:

public static function getShape():Shape{
return new Shape(this)
}


Но я не хотел что бы ShapeData еще заведовала тем, что создовала какой то конкретный объект

ChuwY
22.02.2011, 23:25
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];
}
}
}

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;
}
}

}


package {

public class ShapeData2 extends ShapeData {

public function ShapeData2() {
// constructor code
}

}

}


package {

public class ShapeData3 extends ShapeData{

public function ShapeData3() {
// constructor code
}

}

}

Wolsh
23.02.2011, 00:00
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