Глобальный импорт класса в AS3 / Flash CS5 - PullRequest
0 голосов
/ 11 декабря 2011

У меня есть проект в ActionScript 3, Flash Professional CS5.5 и AIR 3.

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

import trailcrest.core.core;
var Core:core = new core();

Тем не менее, я пришел к реализации в своем коде ... это создает копию класса и не дает доступа к оригиналу,Это, конечно, проблема - мне нужны сценарии одного символа для изменения переменной в классе, а сценарии другого символа обращаются к этой измененной переменной.Очевидно, что сейчас этого не происходит.

Как мне поступить так, как я описываю?Должен ли я каким-то образом создать «публичную переменную» для класса (хотя мне нужны инструкции о том, как это сделать ... Я не могу использовать «публичную переменную» в пределах этапов или символов)?Есть ли какой-нибудь способ прямого доступа к классу?

Помогите!И заранее спасибо.

Ответы [ 4 ]

2 голосов
/ 12 декабря 2011

Лучший способ - создать нечто, называемое «синглтон». Синглтон - это, довольно просто, статический класс без всех противных минусов статического класса. Это делает один экземпляр (или одну копию) доступным глобально, который затем будет действовать точно так же, как обычный экземпляр (потому что это так).

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

Math.PI

не так:

var math:Math = new Math();
math.PI

Как видите, метод принадлежит классу. Мы можем использовать это для создания синглтона, предоставив статическую функцию getInstance(), которая будет доступна глобально и всегда будет возвращать один и тот же объект. Вот пример реализации синглтона:

package {

    public class SingletonSample {

        // The singleton instance
        private static sharedSingleton:SingletonSample = null;

        // The constructor. AS3 doesn't allow for private constructors
        // so we have to protect it manually
        public function SingletonSample() {
            if (sharedSingleton != null)
                throw new Error ("SingletonSample cannot be created with the new keyword. Use getInstance() instead.");
        }

        // The method that will get the actual instance
        public function getInstance():SingletonSample {
            if (sharedSingleton == null)
                sharedSingleton = new SharedSingleton();
            return sharedSingleton;
        }

    }

}

Помимо методов и переменных, определенных в образце, остальная часть класса может быть запрограммирована как обычно. Затем, когда вы хотите использовать класс в своем коде, вместо этого:

var instance:SingletonSample = new SingletonSample();
instance.doAThing(instance.aProperty);

сделать это:

var instance:SingletonSample = SingletonSample.getInstance();
instance.doAThing(instance.aProperty);

На самом деле, когда вы просто быстро вызываете методы, вам вообще не нужно создавать локальную переменную. Просто сделайте что-то вроде этого:

SingletonSample.getInstance.aQuickFunction();

Это все доступно глобально, при условии, что класс SingletonSample был импортирован. Этот шаблон дизайна делает класс «менеджер», поэтому он, вероятно, будет соответствовать вашим потребностям. Имейте в виду, однако, что синглтоны, как правило, не годятся для того, чтобы на самом деле манипулировать объектами. Используйте их как менеджеров , которые предоставляют ссылки на другие вещи, своего рода «посреднический» класс, если хотите. Однако при правильном использовании они могут стать мощным и удобным инструментом в арсенале программиста.

2 голосов
/ 11 декабря 2011

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

import trailcrest.core.core;
var Core:core = new core();

Это хорошо!

Если объект должен изменитьзначение свойства в Core, вам просто нужно сообщить Core об изменении значения, отправив событие.

 var object:MovieClip = new MovieClip();
 object.dispatchEvent ( property );

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

Если это не ваш класс документов, то вы можете сделать ...

 //In the Document Class
 var Core:core = new Core();
 var object:MovieClip = new MovieClip();

 // CoreEvent being a Custom Event
 object.addEventListener( CoreEvent.CHANGE , changeListener );
 addChild( object );

 //in another part of the Document Class
 //after a value has changed
 object.dispatchEvent ( property );

 //a method of the Document Class
 private function changeListener( event:CoreEvent ):void
 {
      var propNewValue:Object = event.property;
      //If you're using a singe instane of Core in the Document
      //Class, any other symbol can now access the new value.
      core.property = propNewValue;
 }

Если объекты создаются в других частях вашего приложения, вы всегда можете передать экземпляр Core в качестве параметра.

  //In the Document Class
  var newobject:MovieClip = new CustomClass( core );

Редактировать

Если вы находите этот ответ непонятным,вам, вероятно, следует прочитать об основных принципах ООП, а также о диспетчеризации событий в AS3.Что-то интересное может быть Библиотека сигналов , хорошая альтернатива диспетчеризации событий.

Общая идея состоит в том, чтобы избежать привязки ваших объектов к Singleton, или любого типа глобальных переменных.,Теоретически, объект должен знать только о себе, и вы будете использовать события для объектов для связи между собой.

2 голосов
/ 11 декабря 2011

Это прекрасно достигается с помощью шаблона проектирования Singleton .Вот пример реализации AS3:

package   {

public class SomeClass {

    /** Singleton instance */
    private static var instance : SomeClass;

    /** This instance variable will be accesible globaly by calling it SomeClass.getInstance().somePublicVar */
    public var somePublicVar    : * ;

    /**
     * Get singleton instance of class
     * @return  singleton instance  SomeClass
     */
    public static function getInstance () : SomeClass {
        return SomeClass.instance ? SomeClass.instance : ( SomeClass.instance = new SomeClass() );
    }

}

}

1 голос
/ 11 декабря 2011

Вы можете использовать статическую переменную класса, например:

package trailcrest.core {
    import trailcrest.core.core;
    public class YourCustomClass {
        public static var coreReachableFromAnywhere:Core //THE STATIC VARIABLE FOR CORE
    }
}

Затем в коде вашего внука:

import trailcrest.core.YourCustomClass;
yourCustomClass.coreReachableFromAnywhere = new Core();
yourCustomClass.coreReachableFromAnywhere.someMethod() ...

Редактировать

Конечно, добавление метода синглтонного типа, как предлагали другие, сделало бы его еще чище, я также проголосую за их ответы.

...