【问题标题】:Organizing Long Scripts In Separate Files?在单独的文件中组织长脚本?
【发布时间】:2010-10-07 01:09:02
【问题描述】:

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

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

假设我没有完全使用适当的设计模式,下面是我完成这项任务的不成功尝试:

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

【问题讨论】:

  • 听起来你遇到了反模式“神级”

标签: actionscript-3 class file-structure


【解决方案1】:
公共类 MainClass 扩展 Sprite { 私有变量子类:子类; 公共函数主类 { var 控制器:控制器 = 新控制器(); 子类 = 新子类(控制器); addChild(子类); } 私有函数 init():void { subClass.doWhatever(); } } 公共类控制器 { 公共函数 doThis():void { } 公共函数 doThat():void { trace("控制器这样做..."); } 公共函数 doSomethingElse():void { } } 公共类子类扩展雪碧 { 私有变量控制器:控制器; 公共函数子类(控制器:控制器) { this.controller = 控制器; trace("新的子类实例!"); } 公共函数 doWhatever():void { 控制器.doThat(); } }

【讨论】:

  • 这不t work since i also want to use properties and functions of the superclass inside functions of the subclass. maybe there is a more straight forward approach? maybe using a static class that can be called from my controller class, though im 仍然不确定我是否能够在静态类中使用控制器类的方法和变量。
  • 我已经编辑了我的问题,这样我想要做的事情就更清楚了。
  • 检查编辑后的答案...这是一种解决方法,但还有其他选择。我认为让子类访问主类的属性和方法不是一个好的设计,这就是我使用 Controller 类的原因,但这仍然是一个基本示例......如果你尝试看看一些设计模式有机会。
  • 好的...我可能不应该做我想做的事,因为它既不容易也不常见。我会研究设计模式。
  • 这并不常见,因为您的类将与您的主类紧密耦合,因此很难升级甚至调试。设计模式的主要概念之一是黑盒原则,这意味着您可以与对象交互,而不必知道内部是什么,并且对象依赖于外部的功能。这基本上就是你的类的结构。然后你就可以在不破坏任何东西的情况下删除、添加或对类进行任何更改。
【解决方案2】:

这段代码

//Call Tracer Function 
tracer(); 

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

这个:

super.addChild(sq);

也不起作用,因为 NewFile 不继承任何类; super() 在继承关系中调用母类的同名方法。你应该做的更可能是一个 COMPOSITION 或 AGGREGATION 关系:newFile 不是控制器,但控制器有一个 newFile。

如果您不向我们提供错误消息,则很难确切知道哪里出了问题。

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

【讨论】:

  • 是的,我想我已经尽力了。可能有效的方法是将我的 newFile 类所需的属性和函数设置为静态,但问题是我的主控制器类是一个文档类,它还需要将这些属性和函数设置为非静态的。我弄得一团糟,我会撤退的。感谢您的意见。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-04
  • 1970-01-01
  • 2021-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多