X

操作子SWF(四)接口或继承

在模块开发方式下总是会有很多独立的模块,而这些模块都是在需要时运行,不需要时暂停.当然,可以在需要时加载,不需要时卸载掉,如果这些模块的运行和暂停操作很频繁,又或者他们自己还保存了一些有状态的数据(比如size),那么就不能频繁的加载和卸载了,因为会造成内存的增加和cpu的频繁波动.那么可以在第一次加载完成后一直持有这些对象而不卸载,然后调用start和pause方法来实现运行与暂停.

流程

  1. 写一个接口(ISubSWF)或基类(SubSWFBase).
  2. 在子swf里应用接口ISubSWF或者继承SubSWFBase.
  3. 将子swf导出为subSWF.swf.
  4. MainSWF加载SubSWF.
  5. 将SubSWF的实例强转为ISubSWF或者SubSWFBase.
  6. 这样就能对接口或者基类进行操作而不用关心具体是什么类了.

简单代码

接口ISubSWF

package  
{
    public interface ISubSWF 
    {
        // 开始方法,具体类要实现该方法
        function start():void;
        // 暂停方法,具体类要实现该方法
        function pause():void;
    }
}

基类SubSWFBase

package  
{
    import flash.display.Sprite;
    public class SubSWFBase extends Sprite
    {
        // 开始方法,子类要重写该方法
        public function start():void { }
        // 暂停方法,子类要重写该方法
        public function pause():void { }
    }
}

SubSWF类应用接口的实现

package  
{
    import flash.display.Sprite;
    public class SubSWF extends Sprite implements ISubSWF
    {
        public function start():void
        {
            trace("the subSWF started!");
        }
        public function pause():void
        {
            trace("the subSWF pause!");
        }
    }
}

MainSWF使用接口的实现

// 说明要加载的子swf的文件路径
var req:URLRequest = new URLRequest("subSwf.swf");
var loader:Loader = new Loader();
// 一定要用loder.contentLoaderInfo添加侦听,不然不会触发COMPLETE事件
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler);
loader.load(req);

function completeHandler(e:Event):void
{
    // 移除侦听,防止内存泄露
    loader.contentLoaderInfo.removeEventListener(Event.COMPLETE, completeHandler);

    // loader.content就是被加载的子swf,现在将它强转为ISubSWF就能对其操作了
    var subSWF:ISubSWF = loader.content as ISubSWF;
    // 使用接口的方法操作子swf
    subSWF.start();
}

结语

这里不讨论具体是继承好还是接口好,总之都有好适用的情况.当然还可以对swf内部的一个任意类(包括非显示类)和库元件绑定的类使用接口或继承,那样再结合外部swc就能完全避免使用反射,当然如果是外部传入的完全限定名就另当别论了.总之没有最好的方式,只有适合自己的方式.

This post was last modified on 2019 年 03 月 04 日 00:29

This website uses cookies.