Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flash AS3库符号链接_Flash_Actionscript 3_Symbols_Linkage - Fatal编程技术网

Flash AS3库符号链接

Flash AS3库符号链接,flash,actionscript-3,symbols,linkage,Flash,Actionscript 3,Symbols,Linkage,使用我创建的类作为库符号的基类时出现问题: 我已经创建了一个类AvSkin,它将作为AvChild实例的显示。看起来是这样的: package avian.environment.skins { import flash.display.DisplayObject; /** * @author Marty Wallace * @version 1.0.0 */ public class AvSkin extends DisplayObjec

使用我创建的类作为库符号的基类时出现问题:

我已经创建了一个类
AvSkin
,它将作为
AvChild
实例的显示。看起来是这样的:

package avian.environment.skins
{
    import flash.display.DisplayObject;

    /**
     * @author Marty Wallace
     * @version 1.0.0
     */
    public class AvSkin extends DisplayObject
    {
        /**
         * Getters
         */
        public function get top():Number{ return y - height/2; }
        public function get left():Number{ return x - width/2; }
        public function get bottom():Number{ return y + height/2; }
        public function get right():Number{ return x + width/2; }
    }
}
var skin:AvSkin = new AvSkin(new MyMovieClip());
显然没有做很多,但关键是我可以在以后添加(即
render()
方法)

问题是,因为这扩展了
DisplayObject
(这样我就可以使皮肤成为
TextField
SimpleButton
Shape
,等等)而不是
MovieClip
,如果我将其设置为库符号的基类,它会抛出此错误:

5000:班级 “avian.environment.skins.AvSkin”必须 子类“flash.display.MovieClip” 因为它链接到库符号 那种类型的

有办法解决这个问题吗?我不想执行以下任一操作:

  • 制作
    AvSkin
    extend
    MovieClip
  • 为扩展
    AvSkin
    的“我的库”符号创建一个类

  • 请参阅,这可能有助于支持我问题背后的推理。

    库符号具有给定的类型,即
    MovieClip
    Sprite
    等等。如果您想从这些继承,就必须将其用作基类。这方面没有解决办法,它是一个面向对象的范例,适用于不支持多重继承的语言,AS3就是这样。不能在继承树的中间扩展某些东西。< /P> 对于您的任务,您可以有一个
    界面
    。但是您必须在所有派生类中实现这个接口。但是实现逻辑可以在静态类中外包,以确保可维护性

    interface IAvSkin 
    {
        function get top():Number;
        function get left():Number;
        function get bottom():Number;
        function get right():Number;
    }
    
    public class AvSkin
    {
        public static function getTop(obj:DisplayObject):Number
        {
            return obj.y - obj.height/2;
        }
    
        // and so on
    }
    
    public class AvSkinMovieClip extends MovieClip implements IAvSkin
    {
        public function get top():Number{ return AvSkin.getTop(this); }
        // and so on
    }
    
    public class AvSkinMovieClip extends Sprite implements IAvSkin
    {
        public function get top():Number{ return AvSkin.getTop(this); }
        // and so on
    }
    

    扩展Sprite怎么样?这是最简单的DisplayObject子类之一,它不会有大多数MovieClip功能。

    只使用composition如何? 您可以实例化AvSkin并发送要扩展到其中的类:

    package avian.environment.skins
    {
        import flash.display.DisplayObject;
    
        /**
         * @author Marty Wallace
         * @version 1.0.0
         */
        public class AvSkin extends DisplayObject
        {
            protected var _component:DisplayObject;
    
            public function AvSkin(component:DisplayObject) {
                addChild(_component = component);
            }
            /**
             * Getters
             */
            public function get top():Number{ return y - height/2; }
            public function get left():Number{ return x - width/2; }
            public function get bottom():Number{ return y + height/2; }
            public function get right():Number{ return x + width/2; }
        }
    }
    
    然后像这样使用它:

    package avian.environment.skins
    {
        import flash.display.DisplayObject;
    
        /**
         * @author Marty Wallace
         * @version 1.0.0
         */
        public class AvSkin extends DisplayObject
        {
            /**
             * Getters
             */
            public function get top():Number{ return y - height/2; }
            public function get left():Number{ return x - width/2; }
            public function get bottom():Number{ return y + height/2; }
            public function get right():Number{ return x + width/2; }
        }
    }
    
    var skin:AvSkin = new AvSkin(new MyMovieClip());
    

    现在,您可以根据自己的喜好对其进行超类化。

    Hmm是否可以不扩展MovieClip,而是扩展所有常见的DisplayObject子类?喜欢某种多重继承?我可以创建多种类型的皮肤,比如Avmovieclipsking、AvBitmapsking等,但是我无法扩展一个普通的皮肤类,因此必须在每个皮肤类中重复上述逻辑。实际上,有一种方法可以解决这个问题。如果您在每个派生类中使用“include”关键字,并将其指向一个常见的ActionScript文件(基本上是类的一部分,而不是整个声明),您可以将代码集中在一个位置,以便在所有类型中轻松添加更新和附加功能。这是一个好主意,但对我来说似乎是草率的,草率的,是的,但这是一个特殊的情况,它可以是有益的。这取决于更新或修改代码的频率。我有过这方面的经验,而且在第一次启动时调试确实很糟糕,但一旦一切都稳定下来,它就非常棒了。有趣的方法。但是不喜欢静态名称空间。您还可以有一个非静态助手
    new AvHelper(this.getTop())
    但是为该任务创建对象需要不必要的内存和执行时间。您还必须在实现IAvSkin的每个类中重新定义getter/其他方法,这不太吸引人。这个答案现在看起来很好;不过,我有一个问题:在接口中定义getter是否比在实现它的每个类中重新创建方法更有利(而不是可读性)?如果要实现接口,请确定这些getter存在于对象上。您可以在代码中使用类型
    IAvSkin
    而不是DisplayObject、Sprite或MovieClip。您可以将对象强制转换为
    IAvSkin
    ,如果此强制转换成功,您就知道存在getter实现。如果皮肤是位图、形状或视频,该怎么办?真的!我不确定你是否需要这些:(啊,对不起。我添加了一个链接,指向可以是AvSkin(DisplayObject下的所有内容)的类型。首先应该添加说明。看起来你是在进行打字,这不需要在类本身中进行太多工作。这也不能解决我的问题,即链接库符号以使用AvSkin作为基类。感谢你尝试。是的,你将无法直接链接到该类。如果你e使用flashide将项目拖到舞台上这不会有什么帮助,但是如果您是从代码中实例化的,那么将其包装为参数并没有多大区别。