Я хочу получить доступ к общедоступному статическому константу в моем ActionScript без создания объекта ... Это возможно? - PullRequest
0 голосов
/ 14 февраля 2010

У меня есть статическое свойство, к которому я хотел бы получить доступ путем импорта его класса без создания экземпляра объекта этого класса. Возможно ли это?

По сути, я пишу несколько объектов 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 постскриптум Кто хочет, чтобы клавиша Tab работала в этом окне редактора вопросов?

Ответы [ 3 ]

3 голосов
/ 14 февраля 2010

Вы можете написать статическую функцию 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;
2 голосов
/ 14 февраля 2010

Вам не нужно создавать экземпляр класса для ACCESS его статических членов, но вы инициируете статическую переменную внутри конструктора классов.

Это означает, что в тот момент, когда вы обращаетесь к статической переменной, вот так:

textField.styleSheet = CSS.STYLE_SHEET;

Свойство STYLE_SHEET еще не установлено!

Обычно способ обойти подобные вещи - использовать статический метод init.

CSS.init();

Метод init установит STYLE_SHEET, как вы это сделали в своем конструкторе.

Это означает, что в вашем приложении вам придется вызывать CSS.init () один раз, прежде чем использовать STYLE_SHEET где-либо еще.

ТАКЖЕ: То, что вы называете «const», вовсе не является const. Это просто статика. Const означает, что значение является постоянным (никогда не изменяется).

1 голос
/ 14 февраля 2010

Спасибо и Иванн, и Тандем Адам за то, что они привели меня на правильный путь. В конечном итоге я понял, что сначала мне пришлось создать экземпляр моего класса, потому что я определял свойства переменных в функции конструктора. Поэтому я построил статическую функцию конструктора, которая избавила от необходимости создавать экземпляры, но мне все равно пришлось вызывать функцию (а не просто импортировать).

Затем, как указал Иванн, мне вообще не нужно вызывать функцию, если я просто создаю статическую функцию init (). Потрясающая идея, за исключением того, что пропущен один бит информации. Вы не можете объявлять переменные в статическом инициализаторе. Итак, окончательным решением было вызвать мою частную статическую функцию, которая МОЖЕТ объявлять переменные из моей статической функции initilaizer.

пример:

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);

        }

   }

}
...