AS3 Нетипизированный конструктор args ошибка / обходной путь - PullRequest
0 голосов
/ 15 июня 2011

Вот тема, которая была рассмотрена во многих местах, но с одним оставшимся вопросом к ней.

При использовании отражения (descriptionType) для перечисления аргументов конструктора класса, как вы, возможно, знаете, существует ошибкав Flash Player <10.1, что приводит к нетипизированию аргументов конструктора (type = "*") в некоторых случаях.Широко распространенное решение этой проблемы состоит в том, чтобы предварительно создать экземпляр рассматриваемого класса с правильным количеством нулевых значений, переданных в качестве аргументов, и затем снова вызвать descriptionType для класса. </p>

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

public function SomeClass(model:Model) {
    _model = model; // OK
    _model.addEventListener(Event.CHANGE, _onChange); // Throws error, great!
}

В этом случае у нас остается не функционирующий экземпляр SomeClass, который может быть обнулен, и все будут счастливы.Но что произойдет, если конструктор успеет связать себя с чем-то за пределами класса:

public function SomeClass(model:Model) {
    _someOtherClass = new SomeOtherClass();
    _someOtherClass.addEventListener(Event.CHANGE, _onOtherChange); // Uh-oh..

    _model = model;
    _model.addEventListener(Event.CHANGE, _onChange); // Throws error too late!
}

Что произойдет, если у вас останется случайный экземпляр, который может вызвать непредвиденное поведение и / или утечки памяти.

Вы можете обойти эту проблему, переставив строки в конструкторе, чтобы убедиться, что он выдаст ошибку и своевременно прервет работу.Но это не устойчивый вариант для фреймворка.

Есть идеи?

...