我是面向对象编程和flash的新手。据我所知,全局变量和函数都是邪恶的东西。我们必须使用对象,对吧?
到目前为止,除了我想要的时候,一切都很顺利。创建一个日志函数,它将调试消息写入文本字段对象。
问题在于我需要能够在所有地方,儿童,这些孩子的孩子以及这些孩子的父母等中使用此日志功能 - 在代码中的任何地方。
我应该如何以良好的面向对象的方式做到这一点?因为,当我在对象A中调用它并且想要在对象A的子对象B中使用它时,该对象将不再可访问。
答案 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(单例,静态函数)