调用函数出类

时间:2011-07-23 11:34:08

标签: flash flex class actionscript

我有这段代码有问题。你能帮帮我吗?

package Classes
{
    import mx.controls.Button;

    public class Pages
    {
        public function Pages(){

        }

        public function LoginPage():void{
            AddButton('cmdLogin', 'Login');
        }

        private function AddButton(id:String, label:String, x:int, y:int, width:int, height:int):void {
            if (id.length > 0 && label.length > 0) {
            var button:Button = new Button();
            button.id = id;
            button.label = label;
            button.x = x;
            button.y = y;
            button.width = width;
            button.height = height;
            Main.addChild(button);
            }
        }
    }
}

Main.mxml

    <?xml version="1.0" encoding="utf-8"?>
    <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
                   xmlns:s="library://ns.adobe.com/flex/spark" 
                   xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600" creationComplete="main()">
        <fx:Script>
            <![CDATA[
                import Classes.Pages;

                private function main():void {
                    Pages.LoginPage();    // <---- HERE IS AN ERROR
//Description   Resource    Path    Location    Type
1061: Call to a possibly undefined method LoginPage through a reference with static type Class. Main.mxml   /File Hosting/src   line 30 Flex Problem

                }

            ]]>
        </fx:Script>
    </s:Application>

2 个答案:

答案 0 :(得分:2)

问题是你没有意识到类和类实例之间的区别。我建议你从基础知识中阅读更多关于OOP的内容。因为即使你会遵循@LarsBlåsjö的建议,你也会遇到问题:

Main.addChild(button);

引用类Main但不引用实例。类Main没有(静态)方法addChild()。所以这将是另一个编译器错误。但编译器错误不是问题。你可以轻松修复它们。问题在于OOP理解和理解类和实例的交互和OOP原则,因此缺乏所有代码都使用全局或静态或具有高耦合的体系结构。

所以请阅读有关OOP和设计模式的更多信息。它可以改变你的未来:)

答案 1 :(得分:1)

如果要在类上调用方法,而不是创建该类的实例并调用该实例的方法,则需要将该函数声明为static

所以你可以这样做:

public static function LoginPage():void{
   AddButton('cmdLogin', 'Login');
}

...

Pages.LoginPage();

...或者您可以创建Pages的实例,并在该对象上调用该方法,这可以被认为是正常情况:

var pages:Pages = new Pages();
pages.LoginPage();