Доступ к классу Document в AS3

Как могут экземплярированные классы получить доступ к классу Document?

Даже после того, как я назовите класс Document, используя панель свойств во Flash, попытка доступа к нему из других классов обычно терпит неудачу, говоря "попытка получить доступ к свойству undefined...

Одно решение всегда отличает класс Document к себе!, например.

Main(Main).globalMethod();

Но иногда даже эта звездная ошибка выходит из строя, а затем обычно нет выхода, кроме очевидного!

class Other{

   var parentClass:Main;
   public function Other(parent:Main){
       parentClass = parent;            // pointer to the Main class in a local var!

       Main(parentClass).globalMethod();
   }
}

Ответы

Ответ 1

Вы можете использовать singleton для вашего класса документа (Main в вашем примере), который позволяет вам получить доступ к экземпляру из любого места.

public class Main extends Sprite {
    private static var _instance:Main;
    public static function get instance():Main { return _instance; }

    public function Main() {
        _instance = this;
       // etc...
    }

    // etc...
}

Затем вы получаете доступ к экземпляру Main следующим образом:

public class Other {
    public function Other() {
        Main.instance.usefulInstanceMethod();
    }
}

Класс документа является довольно хорошим кандидатом для шаблона singleton, потому что обычно он должен быть доступен только для экземпляра.

Ответ 2

Класс документа по своей сути не является глобально доступным объектом. Если вы хотите вызвать методы, которые находятся в классе документа, вам всегда нужно передать ссылку от Main на любые другие классы/объекты, которые хотят вызывать его методы. Более объектно-ориентированный подход состоял бы в том, чтобы отправлять события из ваших других классов (Другие) для основного класса для прослушивания и вызова соответствующего метода сам по себе.

Если вы не заботитесь о сохранении хорошей структуры ООП и хотите получить доступ к классу документов из экранного объекта, который был добавлен в список отображения, вы можете попробовать что-то вроде: stage.getChildAt( 0 );

Ответ 3

Просто примечание, но самый короткий ответ на этот вопрос: так же, как любой класс получает доступ к любому другому классу. То есть, с прямой ссылкой или статической экспозицией. Класс документа ничем не отличается от любого другого класса в этом отношении.