ActionScript. Передача и создание ссылки на класс, содержащий обязательные параметры? - PullRequest
1 голос
/ 01 сентября 2011

Я безуспешно пытаюсь создать экземпляр ссылки на класс, который передается в качестве параметра другому классу.

в этом примере есть 3 класса: MainClass, Canvas, MyCircle

из MainClass Я создаю экземпляр Canvas, которому передается ссылка на класс MyCircle, поскольку я хочу создать экземпляры MyCircle из Canvas.однако конструктор MyCircle содержит обязательные параметры, созданные в Canvas.

как передать и создать ссылку на класс с необходимыми параметрами?

MyCircle:

package
{
    //Imports
    import flash.display.Shape;

    //Class
    public class MyCircle extends Shape
    {
        //Constructor
        public function MyCircle(color:uint, radius:uint)
        {
            graphics.beginFill(color, 1.0);
            graphics.drawCircle(0, 0, radius);
            graphics.endFill();
        }
    }
}

Холст:

package
{
    //Imports
    import flash.display.DisplayObject;
    import flash.display.Sprite;
    import flash.utils.getDefinitionByName;

    //Class
    public class Canvas extends Sprite
    {
        //Constructor
        public function Canvas(circleClassReference:String, amount:uint)
        {
            var CircleReference:Class = getDefinitionByName(circleClassReference) as Class;

            for (var i:uint = 0; i < amount; i++)
            {
                var randomColor:uint = Math.random() * 0xFFFFFF;
                var randomRadius:uint = Math.random() * 100 + 50;

                var circleInstance:DisplayObject = new CircleReference(randomColor, randomRadius);
                circleInstance.y = i * randomRadius;

                addChild(circleInstance);   
            }
        }
    }   
}

Основной класс:

package
{
    //Imports
    import flash.display.Sprite;

    //Class
    public class MainClass extends Sprite
    {
        //Constructor
        public function MainClass()
        {
            var myCanvas:Canvas = new Canvas("MyCircle", 10);
            addChild(myCanvas)
        }
    }
} 

[ПРАВИТЬ]


кажется, что передача фактического класса вместо имени класса устраняет необходимость в грязном исправлении, которое упоминается ниже.

MainClass Constructor

public function MainClass()
{   
    var myCanvas:Canvas = new Canvas(MyCircle, 10);
    addChild(myCanvas)
}

Конструктор холста

public function Canvas(circleClassReference:Class, amount:uint)
{
    var CircleReference:Class = circleClassReference;

    for (var i:uint = 0; i < amount; i++)
    {
        var randomColor:uint = Math.random() * 0xFFFFFF;
        var randomRadius:uint = Math.random() * 100 + 50;

        var circleInstance:DisplayObject = new CircleReference(randomColor, randomRadius);
        circleInstance.y = i * randomRadius;

        addChild(circleInstance);   
    }
}

Ответы [ 2 ]

3 голосов
/ 01 сентября 2011

Импорт (или нахождение в одном пакете) недостаточен для того, чтобы компилятор включил определение класса в домен приложения. На самом деле вам придется где-то использовать нужный класс или встраивать определение в SWF-файл, в который вы загружаете. Это должно исправить вашу ошибку, хотя:

package
{
    //Imports
    import flash.display.Sprite;

    //Class
    public class MainClass extends Sprite
    {
        //Constructor
        public function MainClass()
        {
            //unused variable definition for class embedding purposes
            var tempCircle:MyCircle;
            var myCanvas:Canvas = new Canvas("MyCircle", 10);
            addChild(myCanvas)
        }
    }
}

Несмотря на то, что это предотвратит неопределенность MyCircle в дальнейшем, я всегда считал это немного грязным исправлением (несмотря на то, что оно было в некоторых довольно крупных проектах). Я хотел бы знать лучшее решение, кроме встраивания определения в отдельный SWF.

1 голос
/ 01 сентября 2011

Знаете ли вы, что вы можете относиться к классам как к объектам?

В зависимости от того, что вы пытаетесь сделать, вы можете сделать что-то вроде этого:

Мой круг:

package
{
    //Imports
    import flash.display.Shape;

    //Class
    public class MyCircle extends Shape
    {
        //Constructor
        public function MyCircle(color:uint, radius:uint);
        {
            graphics.beginFill(color, 1.0);
            graphics.drawCircle(0, 0, radius);
            graphics.endFill();
        }
    }
}

Canvas:

package
{
    //Imports
    import flash.display.DisplayObject;
    import flash.display.Sprite;
    import flash.utils.getDefinitionByName;

    //Class
    public class Canvas extends Sprite
    {
        //Constructor
        public function Canvas(classToCreate:Class, amount:uint)
        {
            for (var i:uint = 0; i < amount; i++)
            {
                var randomColor:uint = Math.random() * 0xFFFFFF;
                var randomRadius:uint = Math.random() * 100 + 50;

                var circleInstance:DisplayObject = new classToCreate(randomColor, randomRadius);
                circleInstance.y = i * randomRadius;

                addChild(circleInstance);   
            }
        }
    }   
}

MainClass:

package
{
    //Imports
    import flash.display.Sprite;

    //Class
    public class MainClass extends Sprite
    {
        //Constructor
        public function MainClass()
        {
            var myCanvas:Canvas = new Canvas(MyCircle, 10);
            addChild(myCanvas)
        }
    }
} 
...