Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 以面向对象的正确方式访问父类_Actionscript 3_Oop_User Interface_Scope_Control Flow - Fatal编程技术网

Actionscript 3 以面向对象的正确方式访问父类

Actionscript 3 以面向对象的正确方式访问父类,actionscript-3,oop,user-interface,scope,control-flow,Actionscript 3,Oop,User Interface,Scope,Control Flow,我刚开始编程OOP,我遇到了一个范围问题。 在下面的项目中,我有一个名为App的masterClass。App类有屏幕:屏幕类和导航类作为它的子类。在导航类中,我想控制将显示哪些屏幕。我不知道怎么做 请检查代码以完全理解我的意图 非常感谢您的帮助,我很想真正学习编程,而不仅仅是一个肮脏的解决方案:)但欢迎所有建议 // Main Class // public class App extends Sprite { private var screens:Array; pr

我刚开始编程OOP,我遇到了一个范围问题。 在下面的项目中,我有一个名为App的masterClass。App类有屏幕:屏幕类和导航类作为它的子类。在导航类中,我想控制将显示哪些屏幕。我不知道怎么做

请检查代码以完全理解我的意图

非常感谢您的帮助,我很想真正学习编程,而不仅仅是一个肮脏的解决方案:)但欢迎所有建议

// Main Class //
public class App extends Sprite
{
    private var screens:Array;
        private var screen1:Screen;
        private var screen2:Screen;
        private var screen3:Screen;
        private var screen4:Screen;

    public var currentScreen:String;
    //



    private var navigation:Navigation;

    public function App()
    {
        init();
    }

    private function init():void {
        buildScreens();

        buildNavigation();
    }

    private function buildScreens():void {
        screen1 = new Screen();
        screen1.name = 'startScreen';
        currentScreen = screen1.name;
        addChild(screen1);

        screen2 = new Screen();
        screen2.name = 'irrelevantA';

        screen3 = new Screen();
        screen3.name = 'irrelevantB';

        screen4 = new Screen();
        screen4.name = 'irrelevantC';


        screens = new Array(screen1, screen2, screen3, screen4);


    }

    private function buildNavigation():void {
        navigation = new Navigation(screens);
    }
}

// Screen Class //
public class Screen extends Sprite
{
    public function Screen()
    {
        // creates a new screen
    }
}


// Navigation Class //
public class Navigation extends Sprite
{
    private var buttons:Array;

    public function Navigation(screens:Array)
    {
        addButtons(screens);
    }

    private function addButtons(screens:Array):void {
        buttons = new Array();

        for each(var screen:Screen in screens) {
            var button:Button = new Button();
            button.link = screen.name;
            button.addEventListener(MouseEvent.MOUSE_DOWN, mouseDown);
            buttons.push(button);
        }
    }

    private function mouseDown(e:MouseEvent):void {
        // THIS IS WHAT MY QUESTION IS ABOUT: How should I talk to the parent class in an OOP correct way?
        // and how can I add and remove a screen in the App class from here?

        // Here some of my tries
        // I don't think using parent to get there is a good way because next time it might be; parent.parent.parent
        trace(e.target.parent.parent.currentScreen);
        this.parent.currentScreen;
        stage.App.currentScreen;
        App.currentScreen;


        //---------------------------------
    }
}

// Button Class //
public class Button extends Sprite
{
    public var link:String;

    public function Button()
    {
        // creates a new button
    }
}

基本上,您希望通过将引用作为参数传递(就像您使用screens数组所做的那样)来向下(父级到子级)通信,并通过调用公共函数来向上(子级到父级)通信

因此,在您的情况下,类似这样的情况:

应用程序类别:

private function buildNavigation():void {
   navigation = new Navigation(this, screens);
}
//etc
public function changeScreen(newScreen:int):void{
    //Your logic for adding/removing screens goes here
}
导航类:

 private var app:App

 public function Navigation(app:App, screens:Array)
    {
        this.app = app
        addButtons(screens);
    }

    private function addButtons(screens:Array):void {
        buttons = new Array();

        for each(var screen:Screen in screens) {
            var button:Button = new Button();
            button.link = screen.name;
            button.addEventListener(MouseEvent.MOUSE_DOWN, mouseDown);
            buttons.push(button);
        }
    }

    private function mouseDown(e:MouseEvent):void {
       app.changeScreens(2);
    }
}

显然,改变实现以满足您的需要(例如,现在您有了对App类的引用,考虑如果您需要通过单独的对屏幕数组的引用),这只是您可以如何通信的一个例子。p> 如果直接从子对象访问父类,则会创建强耦合—这正是构建良好的系统所不希望的。最好不要直接访问应用程序对象,而是使用事件侦听器和自定义事件来促进来自导航的更改

这里有一个例子。首先,创建一个自定义事件:

public class MyCustomEvent extends Event {

    public static const MENU_ITEM_SELECTED : String = "MENU_ITEM_SELECTED";
    public var selectedItem:String;
}
然后,当单击按钮时,让导航将其分派:

public class Navigation extends Sprite () {
    // ...
    private function onButtonClicked(ev:Event) : void {
        ev.stopPropagation();
        var custEvent:MyCustomEvent = new MyCustomEvent(MyCustomEvent.MENU_ITEM_SELECTED);
        custEvent.selectedItem = ev.target.name;
        this.dispatchEvent (custEvent);
    }
    // ...
}
最后,让应用程序处理自定义事件并显示不同的屏幕:

public class App {
    // ...
    public function createNavigation () : void {
        navigation = new Navigation ();
        navigation.addEventListener (MyCustomEvent.MENU_ITEM_SELECTED, onMenuItemSelected);
        // ... more stuff happening
    }
    // ...

    private function onMenuItemSelected (ev:MyCustomEvent) : void {
        switchToScreen (ev.selectedItem);
    }

    private function switchToScreen (name:String) : void {
        // choose screen by name, etc.
    }
}

对于所有这些,无论是屏幕还是导航都不需要知道任何其他相关对象的信息,因此您可以轻松地替换每个对象,而不会破坏系统的其余部分。

有了子类中所有这些显式依赖项,您将有一个地狱般的时间来维护和重用代码。你真的想研究一些高级OO主题,特别是松耦合:和控制反转:@weltraumpirat-谢谢你的链接,看起来我有一些阅读要做:)谢谢你的快速回答!解决方案很容易理解:)。我还将进一步阅读:Dwow:D这对我来说真的是一个层次:)我想我必须读几遍才能真正理解。关于反转控制和松耦合的链接我明天会读。谢谢你的完整回答。只有一个问题;我对OOP的了解是,所有对象都有自己的职责。我认为导航应该处理所有关于导航的代码。我现在看到的是App类实际上在做一些导航,对吗?还是我看错了?万分感谢!对不起,我有很多事情要做,完全忘了回答这个问题。。。你必须这样看:这个例子中的导航实际上只是一堆按钮。它只做它应该做的事情:处理用户的鼠标点击,并将点击的内容通知应用程序。实际上,更改应用程序的状态是应用程序本身(或专用控制器组件,但这是另一回事)的责任。这个答案看起来是一个很好的线索,尽管我希望它有更多的细节。很难找到如何用Flash构建复杂导航系统的有用的文章。只需查看事件处理,并考虑设置一个中央事件调度器,你的应用程序中的所有组件都可以侦听到(你可以把它注入到每个组件的构造器中)。这当然是一个复杂的话题。您可能想查看一个已经解决了这个问题的MVC框架,比如RobotLegs。