Flash CS AS3面向对象软件体系结构

Flash CS AS3面向对象软件体系结构,flash,actionscript-3,oop,architecture,Flash,Actionscript 3,Oop,Architecture,当您使用flash从头开始构建一个flash部件时,它主要是AS3,并且您使用的是所有外部文件。作为类文件,您如何构建您的软件?您使用哪种类型的全局变量结构?你的顶级课程看起来总是一样的吗?将主子显示对象附加到根MovieClip时,您使用哪一行代码进行编程?AS3编程在大多数方面应该与C#、Java或其他OO语言编程类似 顶级类保持非常相似,并以Adobe实践为模型。它看起来像这样: package { import flash.display.Sprite; public

当您使用flash从头开始构建一个flash部件时,它主要是AS3,并且您使用的是所有外部文件。作为类文件,您如何构建您的软件?您使用哪种类型的全局变量结构?你的顶级课程看起来总是一样的吗?将主子显示对象附加到根MovieClip时,您使用哪一行代码进行编程?

AS3编程在大多数方面应该与C#、Java或其他OO语言编程类似

顶级类保持非常相似,并以Adobe实践为模型。它看起来像这样:

package 
{
    import flash.display.Sprite;

    public class FirstCircle extends Sprite
    {
        public function FirstCircle( )
        {

        }
    }
}
将代码附加到根MovieClip是在IDE中通过在Flash的主属性中输入类的名称来完成的

不要使用全局变量,像在C#或Java中一样使用属性:


希望这能有所帮助。

在OOP Flash中处理架构问题基本上有两种方法。任何严肃的开发人员都应该熟悉的标准模型使用自定义事件。在上面的示例中,您的window旋钮不知道窗口-它只知道是否已按下。按下时,它将发送一个“knobPressed”事件。Car对象捕获该事件,然后通知WindowManager打开关联的窗口

一开始处理事件有点棘手,因为不清楚如何使用它们发送数据负载。也许你的旋钮可以向上或向下按下,但只发送一个事件。那么,汽车如何知道你是要打开还是关闭车窗?因为您将事件类扩展到创建的WindowKnobEvent,并且在WindowKnobEvent上公开了一个名为“direction”的公共属性,该属性可以设置为向上或向下。当该事件触发并传递到WindowManager时,可能您在那里设置了一个switch语句,以便根据“direction”属性进行不同的行为-这有意义吗

因此,您有95%的时间希望使用事件模型在整个应用程序中传播数据

不过,有时使用回调是合适的。换句话说,您可以在WindowManager中向WindowKnob对象传递对OpenWindow函数的引用。由于函数都是对象,您只需说var openWindowFunction:Function=WindowManager.openWindow,然后将openWindowFunction传递给您的旋钮类

这通常是一个坏主意:这意味着您的代码是紧密耦合的。这意味着你不能拿着那个旋钮,把它丢到另一辆车里——你会把它弄坏的,因为它再也不能保存对第一辆车WindowManager的引用了。但是,在某些情况下,回调可能更有效。例如,在移动设备优化中,通常最好尽量减少创建的对象数量。您分派的每个事件都使用内存。如果只建立一次回调引用,然后让它运行,而不必在每次有人按下按钮时创建一个新的事件对象,这样会更有效一些

这有用吗?我的意思是,AS3 OOP体系结构很难用一个简单的SO响应来概括,但我想要点是:了解事件如何工作,一切都会安排妥当。除非您理解其含义,否则不要使用回调

干杯,我希望这有帮助!
我明白这一切。您使用什么进行对象到对象的通信?Main->Car->Dashbaord->Knob如何调用Main->Car->Window->Open(),Knob显然不应该有一个Window实例。myObject.myMethod.call(myOtherObject,1,2,3)@Ryan的一种方法是执行如下操作:在旋钮功能中分派一个自定义旋钮。按下按钮时按下事件。汽车对象应该正在监听此消息。当收到此事件时,car对象将调用Window->Open()伟大的答案。我想了解有关自定义事件结构的更多详细信息。但我有一个更一般的问题。如何构造显示对象层次结构。如果我有一辆车,而且车有一个引擎、一扇门和一个行李箱,那么我会这样做:
package videogame{import flash.display.*;公共类车扩展MovieClip{private var engine:engine;private var door:door;private var trunk:trunk;公共函数车(){addChild(engine=new engine())……}}
是否有必要为孩子们保留实例变量?我明白你所说的要点,不必担心格式问题。答案并不是一成不变的——我的意思是有一百万种方法可以做事情——但一般来说,当你有这样一个分层对象时,实例变量是一种可靠的方法。您的汽车可以有一个成员“Dashboard”,该成员依次有“Speedometer”和“Radio”等。还有其他解决问题的方法-您可以有一个ComponentManager类,或者只在需要时实例化对象的CARTHOSPOL,但这是一个更高级的架构讨论。根据您的高级编程概念的能力和舒适程度,您可能需要考虑使用像PyReMVC之类的MVC方法。MVC框架的设计允许您添加一些东西,例如一个车窗把手,而不必返回并重新编程您的汽车来收听它。基本上,所有的逻辑都是从汽车的视觉部分分离出来的。显示元素只不过是位图,抽象控制器侦听它们的事件,然后引导它们。在此处了解更多信息:
private var _prop:String;

public function get prop():String {
    return _prop;
}