我希望在没有实例化对象的情况下访问我的Actionscript中的公共静态Const ...这可能吗?

时间:2010-02-14 05:38:22

标签: actionscript-3 class constants

我有一个静态属性,我希望通过导入它的类来访问,而无需实例化该类的对象。这可能吗?

基本上我一遍又一遍地写一堆styleSheet对象。我想如果我有一个名为CSS的类,就像这样:

package com
{
    import flash.text.*;

   public class CSS
   {  

    public static var STYLE_SHEET:StyleSheet = new StyleSheet();

并在构造函数中分配它的所有属性,如:

public function CSS
   {
          //NAV BUTTON
        var navButtonBlock:Object = new Object();
        navButtonBlock.color = "#000000";
        navButtonBlock.fontSize = "25";
        navButtonBlock.fontFamily = "Arial";
        navButtonBlock.marginLeft = "5";
        navButtonBlock.kerning = "true";
        navButtonBlock.fontWeight = "bold";

        //TITLE
        var titleBlock:Object = new Object();
        titleBlock.color = "#CCCCCC";
        titleBlock.fontSize = "25";
        titleBlock.fontFamily = "Arial";
        titleBlock.marginLeft = "5";
        titleBlock.kerning = "true";
        titleBlock.fontWeight = "bold";

        STYLE_SHEET.setStyle("code", titleBlock);
        STYLE_SHEET.setStyle("navButton", navButtonBlock);
}

如果我将课程导入课堂,我希望使用它:

package{
 import com.CSS;

在我的班级里面使用变量如:

textField.styleSheet = CSS.STYLE_SHEET;

我可以省去一些麻烦。 我觉得很奇怪的是我创建了一个类的实例来访问它的const。所以在类头文件中我必须写:

private var css:CSS = new CSS();

尽管我从未最终使用过这个物体...... 这有意义吗?我是以错误的方式来做这件事的吗?

-J 附:谁希望tab键在这个问题编辑器窗口中工作?

3 个答案:

答案 0 :(得分:3)

您可以编写静态init()函数,您只能调用一次,或者您可以使用“静态初始化器”:

package com
{
   import flash.text.*;

   public class CSS
   {  
       public static var STYLE_SHEET:StyleSheet = new StyleSheet();

       // Static init block
       // This block is run once when the class is first accessed
       {
           var navButtonBlock:Object = new Object();
           /*...*/
           var titleBlock:Object = new Object();
           /*...*/
           STYLE_SHEET.setStyle("code", titleBlock);
           STYLE_SHEET.setStyle("navButton", navButtonBlock);
        }
    }
}

现在导入类并使用static var STYLE_SHEET

import com.CSS;
...
textField.styleSheet = CSS.STYLE_SHEET;

答案 1 :(得分:2)

您不必将该类的实例设置为 ACCESS 其静态成员,但您要在类构造函数中启动静态变量。

这意味着您在访问静态变量时会这样:

textField.styleSheet = CSS.STYLE_SHEET;

STYLE_SHEET属性尚未设置!

通常,解决这类问题的方法是使用“init”静态方法。

CSS.init();

init方法将设置STYLE_SHEET,就像在构造函数中一样。

这意味着在您的应用程序中,您必须在其他地方使用STYLE_SHEET之前调用CSS.init()一次。

ALSO: 你所谓的“const”,根本不是一个const。这只是一个静态的。 Const表示值是常量(从不更改)。

答案 2 :(得分:1)

感谢ivann和TandemAdam带领我走上了正确的道路。最后我想出来,首先,我必须实例化我的类的一个实例的原因是因为我在构造函数中定义了我的变量属性。所以我构建了一个静态构造函数,它消除了实例化的需要,但我仍然不得不调用函数(而不仅仅是导入)。

然后,ivann指出,我根本不需要调用该函数如果我只是构建一个静态的init()函数。除了缺少一点信息外,这个想法很棒。您不能在静态初始化程序中声明变量。因此,最终的解决方案是调用我的私有静态函数,该函数可以从我的静态初始化函数声明变量。

示例:

package com.atJascha
{
    import flash.text.*;

   public class CSS
   {  

    public static var STYLE_SHEET:StyleSheet = new StyleSheet();

        {
            init();
        }
        private static function init()
        {
            //NAV BUTTON
            var navButtonBlock:Object = new Object();
            navButtonBlock.color = "#FFFFFF";


            //TITLE
            var titleBlock:Object = new Object();
            titleBlock.color = "#00FFFF";

            STYLE_SHEET.setStyle("navButton", navButtonBlock);
            STYLE_SHEET.setStyle("title", titleBlock);

        }

   }

}