Функции AS3 внутри конструкторов и функции вне конструкторов - PullRequest
1 голос
/ 31 декабря 2011

Каковы основные различия (преимущества / недостатки) объявления функций внутри функции конструктора по умолчанию для нового класса и функций, объявленных вне функции конструктора по умолчанию?Является ли доступ к модификаторам доступа единственной причиной объявления функций вне функций конструктора по умолчанию?

Спасибо.

1 Ответ

4 голосов
/ 31 декабря 2011

Если вы имеете в виду это:

public class MyClass {
    public function MyClass() {
        function myFunction() : void {
        }
    }
}

тогда основным отличием является не только видимость, но и область действия: myFunction() объявляется как временная функция, которая может быть вызвана только из одного и того же метода. После выполнения конструктора функция отбрасывается и собирается как мусор, как и любая временная переменная. Вы можете легко проверить это: просто добавьте «обычную» функцию-член и попробуйте вызвать myFunction() оттуда - компиляция не удастся. Поэтому, конечно, будет пытаться получить доступ к функции из другого класса.

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

Рассмотрим эту стандартную декларацию:

public class MyClass {
    public function myFunction ( param1:String ) : String {
         // doSomething
         return myString;
    }
    public function MyClass() {
    }
}

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

Теперь то же самое объявление из конструктора:

public class MyClass {
    public var myFunction : Function;
    public function MyClass() {
        myFunction = function ( param1:String ) : String {
            // doSomething
            return myString;
        }
    }
}

Мы объявили строго типизированную переменную-член типа Function , которая инициализируется так же, как и функция-член выше. Но его строго типизированный параметр и тип возвращаемого значения оцениваются компилятором только в пределах области объявления - если, например, вы пытаетесь получить доступ к функции, указывающей слишком много параметров:

myClassInstance.myFunction ("whatever", "and", "some", "more");

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

Одним из преимуществ этого подхода является то, что мы можем заменить эту функцию в любое время:

myClassInstance.myFunction = function ( i:int ) : void { trace (i); };

Это совершенно законно и, очевидно, значительно изменит поведение объекта. Если мы сделаем то же самое в примере функции-члена, компилятор также выдаст ошибку.

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