【问题标题】:Interface that is also a Display Object也是一个显示对象的接口
【发布时间】:2011-11-16 17:30:31
【问题描述】:

我有一些实现接口的类,但也扩展了 Sprite 类:

package {
    public interface IState {
        function addMonster():void;
    }
}

package {
    public class Fuzzy extends Sprite implements IState {
        public function addMonster():void {

        }
    }
}

package {
    public class LizardSkin extends Sprite implements IState {
        public function addMonster():void {

        }
    }
}

// Document class 

package {
    public class Main extends MovieClip {
        private var state:IState;
        public function Main():void {
            state = new Fuzzy();

            addChild(state);
        }
    }
}

当我尝试 addChild(state) 时,我不断收到错误消息 1067:将 IState 类型的值隐式强制转换为不相关的类型 flash.display:DisplayObject。

现在我知道我已经看到了类扩展 MovieClip / Sprite 并实现接口的示例......我可以做些什么来实现它,这样我就可以在舞台上添加“状态”,同时实现我想要的方法? ?

【问题讨论】:

    标签: actionscript-3


    【解决方案1】:

    一个简单的演员应该在大多数时候做到这一点:

    addChild(state as DisplayObject);
    

    否则编译器会引发该错误,因为它不假定 IState 始终由 DisplayObject 实现,但如果您可以保证该条件,您始终可以强制转换。

    【讨论】:

    • 感谢这有很大帮助。我以为我将不得不编写一个完整的抽象类来实现接口。
    【解决方案2】:

    在这种情况下我会使用 IDisplayable 接口,如下所示:

    public interface IDisplayable
    {
       function get displayObject():DisplayObject;
    }
    

    它在 Sprite 或 MovieClip 中的实现如下所示:

    public function get displayObject():DisplayObject
    {
         return this;
    }
    

    当您的 IState 接口扩展 IDisplayable 时,可以使用 addChild(state.displayObject); 将您的 IState 对象添加到舞台。

    【讨论】:

    • 我也用这个方法。另一个好处是您可以让一个类成为 DisplayObject 的“Actor”,而不是强制您自己的类扩展 DisplayObject。编码正确,“处理程序”不会注意到这两种情况之间的区别。
    猜你喜欢
    • 2010-11-24
    • 1970-01-01
    • 2012-11-21
    • 2012-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-10
    相关资源
    最近更新 更多