1

因此,我成功地从 XML 文档中获取了一个值,并将其设置到一个名为“AddCommas”的单独类中。跟踪功能向我表明它设置正确。

有关更多详细信息,我的目标是获取语言指示符(“fr”表示法语或“en”表示英语),将其设置在适当的类中并放入我将使用的变量中。现在,我在 if 语句中使用这个变量;这将帮助我根据客户的要求正确格式化数字(逗号、小数、空格)。

但是,我的问题是当我尝试获得使用它的价值时。它总是以 Null 的形式返回。我已经在我的程序中放置了跟踪,试图查明何时发生这种情况,但我找不到它。这是代码...

从 XML 文件中提取并放入集合中(这工作正常,但我添加它是为了您的利益,以防我错过了什么)

 public var commaHold = new AddCommas();
    localLanguage = xmlObj.localLanguage;
    trace("localLanguage + " + localLanguage);
    commaHold.setLanguage(localLanguage); // Set Language
   //More code follows...

这是集合函数 istelf...

public function setLanguage(localLanguage:String){
langHold = localLanguage;
trace("Set Language =  " + langHold); //This always shows a successful set
}

现在我认为在 AS3 中,一旦在我的 AddCommas 类中设置了 langHold,我应该能够使用它,而无需在我正在使用 If 语句的函数中调用 get,对吗?比如这样?

var language = langHold;
if (language == "en"){
trace("Language is = " + language); // More code follows afterwards and as of now, this shows NULL

现在,我尝试了很多 Get 函数来将调用本身中的语言变量添加到该函数中,并且始终相同。我在这里缺少一些基础知识吗?

非常感谢您的宝贵时间。

4

2 回答 2

1

ShaunHusain 使用单例的理论是我需要的完美解决方案。然而,他的代码给了我一个奇怪的 1061 错误,我的格式和代码似乎没有错误。无论如何,我寻找了另一种使用单例的方法,如下所示,这对我来说非常有效。老实说,Shaun 的代码应该适用于任何人,我不知道为什么不适用。我完全愿意承认这可能是我没有看到的一个错字。

我最终将 Set 和 Get 嵌入到 Singletons 类中,并用它作为中介来保存我需要的信息。它工作得很好。

package chart {

    import chart.*;
    //

    public class StaticInstance  {

        private static var instance:StaticInstance;
        private static var allowInstantiation:Boolean;
        private var language:String;

        public static function getInstance():StaticInstance {
        if (instance == null) {
            allowInstantiation = true;
            instance = new StaticInstance();
            allowInstantiation = false;
            }
        return instance;
        }

        public function StaticInstance():void {
        if (!allowInstantiation) {
            throw new Error("Error: Instantiation failed: Use StaticInsance.getInstance() instead of new.");
            }
        }

        public function setLanguage(_language:String):void{
            language = _language;
            trace("language set = " + language);
        }
        public function getLanguage():String{
            return language;
        }
    }
}

这段代码允许我保存数据并从两个不同的类再次调用它。这是一个非常 hack 的工作,而不是仅仅能够在函数之间传递变量,但在我的例子中,我们没有创建这个文件,我们正在修改它并尝试做超出项目原始范围的事情。

再次感谢您的帮助肖恩!我希望这对其他人有帮助!

于 2012-12-05T17:27:39.030 回答
1

如果您希望进行字符串比较,则需要使用引号,除非 en 是字符串变量,因为 langHold 是字符串,例如:

if (language == "en"){

考虑修改 set 函数以使用 as3 关键字,例如:

private var _language:String;

public function set language(value:String):void {
     _language = value;
     //do other stuff here if necessary, put a breakpoint on the line above
}

public function get language():String{
     return _language;
     //put a breakpoint on the line above
}

您应该能够看到您的类的任何实例何时更改了属性。我能想到的唯一其他问题是它不是类的同一个实例,因此不共享您之前设置的属性值。在调试器中,您可以检查它显示的“hashCode”或“地址”,以查看它在遇到断点时是否发生变化。

这是 AS3 中的一个示例 Singleton 结构(全部放在一个文件中):

package com.shaunhusain.singletonExample
{

    public class SingletonExample
    {
        private static var instance:SingletonExample;

        public static function getIntance():SingletonExample
        {
            if( instance == null ) instance = new SingletonExample( new SingletonEnforcer() );
            return instance;
        }

        /**
         * 
         * @param se Blocks creation of new managers instead use static method getInstance
         */
        public function SingletonExample(se:SingletonEnforcer)
        {
        }
    }
}

internal class SingletonEnforcer {public function SingletonEnforcer(){}}

使用来自任何其他类的单个共享实例看起来像这样:

private var singletonInstance:SingletonExample = SingletonExample.getInstance();
于 2012-12-03T22:59:04.647 回答