在单独的文件中组织长脚本?

时间:2010-10-07 01:09:03

标签: actionscript-3 class file-structure

在尝试组织我的代码时,我试图将我的(冗长的)主控制器类拆分为单独的文件,但是我的新文件必须仍然可以访问变量和函数主控制器类。

我正在尝试将我的控制器类中的代码剪切并粘贴到新的类/文件中,允许控制器类调用新类,并允许新类访问控制器类的属性和函数。 / p>

假设我没有完全打击适当的设计模式,下面是我完成此任务的失败尝试:

package
{   
import flash.display.Sprite;
import flash.events.Event;

public class Test extends Sprite
    {
    public var myString:String;

    public function Test()
        {
        if  (stage)
            init(null);
            else
            addEventListener(Event.ADDED_TO_STAGE, init);
        }

    private function init(evt:Event):void
        {
        if  (hasEventListener(Event.ADDED_TO_STAGE))
            removeEventListener(Event.ADDED_TO_STAGE, init);

/////////////// MOVE COMMENTED CODE TO NEW FILE ///////////////////////
//      
//      //Assign The String A Value
//      myString = "Hello world";
//      
//      //Draw A Blue Square
//      var sq:Sprite = new Sprite();
//      sq.graphics.beginFill(0x0000FF);
//      sq.graphics.drawRect(10, 10, 100, 100);
//      sq.graphics.endFill();
//      super.addChild(sq);
//      
//      //Call Tracer Function
//      tracer();
//
//////////////////////////////////////////////////////////////////////

        //Call pasted method in NewFile.as
        NewFile.myNewFunction();     // <- this doesn't work
        }

    public function tracer():void
        {
        trace(myString);
        }
    }
}

新文件无法访问Controller类 - 不起作用。如何编写新文件,以便它可以访问Controller类的属性,函数,阶段等,就好像它的代码从未被删除并且仍然在原始位置一样。

package
{   
public class NewFile
    {
    public static function myNewFuntion():void
        {
        //Assign The String A Value
        myString = "Hello world";

        //Draw A Blue Square
        var sq:Sprite = new Sprite();
        sq.graphics.beginFill(0x0000FF);
        sq.graphics.drawRect(10, 10, 100, 100);
        sq.graphics.endFill();
        super.addChild(sq);

        //Call Tracer Function
        tracer();
        }
    }
}

2 个答案:

答案 0 :(得分:3)

public class MainClass extends Sprite
{
    private var subClass:SubClass;

    public function MainClass
    {
       var controller:Controller = new Controller();

       subClass = new SubClass(controller);
       addChild( subClass );
    }

    private function init():void
    {
       subClass.doWhatever();
    }
}

public class Controller
{

    public function doThis():void
    {
     }
    public function doThat():void
    {
         trace("controller do that...");
     }
    public function doSomethingElse():void
    {
     }
}

public class Subclass extends Sprite
{
     private var controller:Controller;

     public function Subclass(controller:Controller)
     {
         this.controller = controller;
         trace( "new Subclass instance!" );
     }

     public function doWhatever():void
     {
         controller.doThat();
     }
}

答案 1 :(得分:2)

此代码

//Call Tracer Function 
tracer(); 

不起作用,因为跟踪器不是静态方法。

这一个:

super.addChild(sq);

也不会工作,因为NewFile不会继承任何类; super()以inHERITANCE关系调用母班的homonyme方法。你应该做的更多可能是一个组合或聚合关系:newFile不是一个控制器,但是控制器是一个新的文件。

如果你不给我们错误信息,很难确切地知道出了什么问题。

在设计方面,我不得不同意PatrickS。您可能想要检查复合模式,这可能是您需要的模式。