【问题标题】:ActionScript - Passing & Instantiating Class Reference Containing Required Parameters?ActionScript - 传递和实例化包含必需参数的类参考?
【发布时间】:2011-09-01 16:23:37
【问题描述】:

我尝试实例化作为参数传递给另一个类的类的引用失败。

在这个例子中有 3 个类:MainClass、Canvas、MyCircle

我正在从 MainClass 创建一个 Canvas 实例,它传递了一个 MyCircle 的类引用,因为我想从 Canvas 中创建 MyCircle 实例。但是,MyCircle 构造函数包含从 Canvas 中创建的必需参数。

如何使用所需参数传递和实例化类引用?

我的圈子:

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 构造函数

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

【问题讨论】:

  • 你真的在任何地方导入 circle 类吗?据我所知,您做得对,但我看不出代码如何在编译时导入 MyCircle 类。你遇到了什么错误?
  • 在这个例子中,所有 3 个类都在同一个包目录中,所以我不需要导入。我收到ReferenceError: Error #1065: Variable MyCircle is not defined.,它在此行的 Canvas 类中引发错误:var CircleReference:Class = getDefinitionByName(circleClassReference) as Class;
  • 如果您没有在代码中的任何位置引用MyCircle,编译器将不会包含该类。在您的 MainClass 类成员中添加类似 private static var dummy:MyCircle 的内容,然后重试。
  • @bummzack - 我更喜欢将它作为局部变量包含在内,它不需要存在很长时间。

标签: actionscript-3 class parameters reference instantiation


【解决方案1】:

导入(或在同一个包中)不足以使编译器在应用程序域中包含类定义。您实际上必须在某个地方使用您想要的类,或者将定义嵌入到您加载的 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 之外,我很想知道一个更好的解决方案。

【讨论】:

  • 这里是否可以通过传递实际班级而不是班级名称来用一块石头杀死两只鸟?即:public function Canvas(circleClassReference:Class, amount:uint)?
  • 如果这是一个 API,我可能会让用户在传递它之前实例化该类,并要求他们的 DisplayObject 扩展一个 API 类以强制执行您需要的任何功能。这是一个经常出现的限制,我还没有看到令人满意的解决方案。
  • 啊,看来我可以,这样可以避免使用此修复程序。我将更新我的代码以显示此解决方案,但我会接受您的回答,因为它实际上对于我最初尝试做的事情是正确的。
  • 不错。在运行时尝试从外部加载类引用时,这个错误通常会咬我,据我所知,这仍然无法完成。
【解决方案2】:

您知道可以将类视为对象吗?

根据您要执行的操作,您可以执行以下操作:

我的圈子:

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

主类:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-20
    • 2010-12-12
    • 2018-02-16
    • 2015-08-29
    • 1970-01-01
    相关资源
    最近更新 更多