Почему в некоторых классах есть метод init ()? - PullRequest
1 голос
/ 19 мая 2011

Работает ли init() функция после ее создания?

Например:

var circle:MovingCircle = new MovingCircle();
Класс

MovingCircle содержит функцию init().

Может ли кто-нибудь просветить меня с помощью функции init()?

Другой вопрос:

В чем разница между классами MovieClip, Shape и Sprite и когда уместно использовать каждый из них?

Ответы [ 2 ]

4 голосов
/ 19 мая 2011

Отличный ответ Марти выше; но есть другой; чуть более тонкая причина использовать следующую структуру класса:

public class WobbleBobble {
    // Constructor.
    public function WobbleBobble() {
        init();
    }

    private function init() : void {
        // ...<snip>some complex initialisation logic</snip>....
    }
}

Вам может быть интересно, почему конструктор вызывает метод init (); почему бы просто не поместить блок логики сложной инициализации в конструктор?

Ответ в том, что AVM не JIT-код помещается внутри конструктора ; в результате чего он выполняется примерно на 70% медленнее, чем код в других методах.

Связанное сообщение StackOverflow .

3 голосов
/ 19 мая 2011

Конструктор - это то, о чем вы думаете, когда говорите «запустите, как только инициализируете его».

Конструктор использует то же имя, что и класс, например:

public class Pants extends MovieClip
{
    public function Pants()
    {
        trace('hello');
    }
}

Теперь, если мы сделаем:

var p:Pants = new Pants();

Этот код будет также запущен:

trace('hello');

Функция init() - это пользовательская функция, которую люди могут использовать в качестве асинхронного конструктора (т. Е. Функцию, которую вы можете вызывать после определения других переменных и т. Д.).

public class Pants extends MovieClip
{
    public var str:String;

    public function init():void
    {
        trace(str);
    }
}

И тогда это проследит «некоторую строку»:

var p:Pants = new Pants();

p.str = "some string";
p.init();

Лично я использую свою собственную функцию init() в установщике базового класса для своих объектов приложения, например:

public class Pants extends MovieClip
{
    private var _core:ApplicationCore;

    private function _init():void
    {
        trace("application core is: " + _core);
    }

    public function set core(ac:ApplicationCore):void
    {
        _core = ac;
        _init();
    }

    public function get core():ApplicationCore{ return _core; }
}

Тогда я могу сделать это:

var appCore:ApplicationCore = new ApplicationCore();

var p:Pants = new Pants();
p.core = appCore;

Который будет запускать мою функцию init() только после того, как я определю ядро ​​приложения.


Что касается вашего вопроса о различных типах классов - цель состоит в том, чтобы использовать наиболее примитивную форму класса из возможных.

Если вам нужна простая графика, которую вы можете перемещать по экрану, используйте Shape. Если вы хотите определить более сложную графику, используйте Sprite. Если вы хотите иметь анимацию на временной шкале, используйте MovieClip.

По сути, нет необходимости создавать MovieClip, когда все, что вы хотите сделать, это создать синий квадрат, но вам нужно будет использовать MovieClip или Sprite, если вы хотите добавить к нему другие объекты DisplayObject.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...