在面向对象编程(flash)中创建公共函数?

时间:2009-06-25 10:13:03

标签: flash actionscript-3 oop

我是面向对象编程和flash的新手。据我所知,全局变量和函数都是邪恶的东西。我们必须使用对象,对吧?

到目前为止,除了我想要的时候,一切都很顺利。创建一个日志函数,它将调试消息写入文本字段对象。

问题在于我需要能够在所有地方,儿童,这些孩子的孩子以及这些孩子的父母等中使用此日志功能 - 在代码中的任何地方。

我应该如何以良好的面向对象的方式做到这一点?因为,当我在对象A中调用它并且想要在对象A的子对象B中使用它时,该对象将不再可访问。

3 个答案:

答案 0 :(得分:3)

当然,有很多不同的方式,具体取决于您应用的详细信息。 (根据定义,全局变量不是“邪恶的” - 实际上在Flash中,它们可能非常有用。)一种方法是定义一个可公开访问的静态方法,您可以从代码中的任何位置调用它,并且可能是定义为一个单独的类,如:

package
{
    public class MyCustomLogger
    {
        public function MyCustomLogger()
        {
            //
        }

        public static function log(text:String):void
        {
            trace(text);
        }
    }
}

以这种方式定义,您可以在应用程序的任何位置使用ClassName.staticFunctionName表示法调用您的日志函数:

[some code...]

MyCustomLogger.log("My log text.")

[some more code...]

这种方法很常见。从那里,它可以变得更复杂,取决于您的需求;你的帖子表明你想把字符串写入TextField对象,在这种情况下,静态日志函数需要在调用时引用该TextField对象,或者它自己的静态访问路径到TextField实例,如应用程序中的其他地方所定义。在这种情况下,我可能会建议将一个全局实例变量定义到其构造函数中,您可以传递对TextField目标的引用(并使用您的日志函数写入它),或者根据您的特定需求再次使用其他方法。但是出于说明的目的,使用可公开访问的静态方法是您可能考虑的一种相当标准的方法。

答案 1 :(得分:2)

另一种方法是使用Singleton类。 简而言之,它非常类似于Christian向您展示的类,但您访问它的方式是SingletonClass.getInstance()。doSomething()。它背后的原理是类只保留一个自身的实例,因此每次调用getInstance()时,类都会检查是否已创建该实例,并返回它。您可以在此处了解有关它的更多信息并检查它的不同实现: http://life.neophi.com/danielr/2006/10/singleton_pattern_in_as3.html

对于你的情况,我可能会像克里斯蒂安所说的那样采用更简单的静态全球类方式。为了从静态方法log()中访问文本字段,您可以创建另一个静态方法registerTextfield(tf:TextField)并在Textfield的应用程序开头使用Textfield调用它,将其注册到静态变量中,然后从那里。除了克里斯蒂安的例子,它会是这样的:

package
{
    import flash.text.TextField;
    public class MyCustomLogger
    {
        private static var _textfield:TextField;

        public function MyCustomLogger()
        {
                //
        }

        public static function log(text:String):void
        {
                _textfield.text=text;
        }

        public static function registerTextField(textfield:TextField):void
        {
                _textfield=textfield;
        }
    }
}
祝你好运!

答案 2 :(得分:0)

面向对象的方法是创建一个包含日志记录功能的部分(抽象,延迟)类,如果需要使用这些工具,则继承该类。

大多数语言都不允许多重继承,因此必须使用hacks(单例,静态函数)