【问题标题】:I Want Access To a Public Static Const in my Actionscript Without Instantiating an Object... Is That Possible?我希望在不实例化对象的情况下访问我的 Actionscript 中的公共静态常量……这可能吗?
【发布时间】:2010-02-14 05:38:21
【问题描述】:

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

基本上我在一遍又一遍地写一堆 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;

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

private var css:CSS = new CSS();

即使我从未使用过这个对象...
这有意义吗?我会以错误的方式解决这个问题吗?

-J p.s.谁希望 tab 键在这个问题编辑器窗口中起作用?

【问题讨论】:

    标签: actionscript-3 class constants


    【解决方案1】:

    您可以编写静态 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);
            }
        }
    }
    

    现在导入类并只使用静态变量 STYLE_SHEET

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

    【讨论】:

    • 这太邪恶了!我不知道这件事!非常好! +1
    • @ivann,我刚刚发现你不能在静态函数中声明变量......但是你可以调用一个函数......我会发布最终解决方案。
    【解决方案2】:

    您不必创建类的实例来访问它的静态成员,但您是在类构造函数中初始化您的静态变量。

    这意味着在你访问静态变量的时候是这样的:

    textField.styleSheet = CSS.STYLE_SHEET;
    

    STYLE_SHEET 属性尚未设置!

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

    CSS.init();
    

    init 方法会设置 STYLE_SHEET,就像您在构造函数中所做的那样。

    这确实意味着在您的应用程序中,您必须调用 CSS.init() 一次,然后才能在其他任何地方使用 STYLE_SHEET。

    另外: 您所说的“常量”根本不是常量。它只是一个静态的。 Const 表示该值是恒定的(从不改变)。

    【讨论】:

    • 完全有道理。谢谢你。 -J
    【解决方案3】:

    感谢 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);
    
            }
    
       }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-17
      相关资源
      最近更新 更多