Новое в AS3: классы конструктора - PullRequest
1 голос
/ 21 июня 2011

Я читал учебник по созданию класса AS3. Меня смущают конструкторы - это код, выполняемый при создании нового экземпляра класса, верно? Тем не менее, эта часть:

public function Greeter(initialName:String = "") {
name = initialName;
}
public var name:String;

Публичное имя переменной: String part не является частью конструктора, но не должно ли оно быть перед тем местом, где установлена ​​переменная name?

Кроме того, второй вопрос, когда публикуется публичное имя переменной: String; часть выполнена? Функции выполняются, когда некоторый код вызывает это. и конструктор выполняется при создании нового экземпляра класса. Но как насчет кода, который не входит ни в один из них?

Спасибо!

Ответы [ 3 ]

2 голосов
/ 21 июня 2011

Компилятор AS автоматически реорганизует ваш код.В действительности это будет выглядеть примерно так:

public var name:String;
public function Greeter(initialName:String = "") {
    name = initialName;
}

Вы можете проверить это, выполнив следующее:

public var name:String = "Hello!";
public function Greeter(initialName:String = "") {
    trace(name); // outputs Hello!
}

Это тоже будет работать:

public function Greeter(initialName:String = "") {
    trace(name); // outputs Hello!
}
public var name:String = "Hello!";

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

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

РЕДАКТИРОВАТЬ

Я обновляю свой ответ, чтобы ОП получал правильную информацию, даже если другой ответ был принят.

Компилятор перекомпилирует код.См. Изображения ниже - я использую декомпилятор SoThink SWF, который показывает состояние файла класса после публикации SWF.Обратите внимание, как строка выводится, и, таким образом, она фактически реорганизуется таким образом, что она существует в верхней части класса.

Документ Flash, вызывающий класс The Flash document calling the class

Код класса (примечаниепеременная внизу) enter image description here

Декомпилированный код класса SWF (обратите внимание на переменную вверху). Из интереса также обратите внимание, как Flash внутренне изменяет имена переменных, например param1 и т. д. enter image description here

Если у вас есть декомпилятор sothink, вы можете попробовать это сами.

2 голосов
/ 21 июня 2011

В вашем примере вы показываете нечто, называемое переменной-членом.Переменная-член - это нечто, объявленное как var между class <ClassName>{ и соответствующим } (эта область является «телом класса»).Хотя технически он может появляться где угодно в теле класса, он чаще всего находится в самом верху.

Пространство в heap для этих переменных будет выделено при создании класса экземпляра.Таким образом, в вашем случае, помимо необработанного объекта, создаваемого в памяти при вызове new Greeter(), также имеется специальное место для name.В вашем конкретном случае конструктор также присваивает значение этому свойству, но также возможно, чтобы это свойство было null.

Каждый var, не отмеченный static, будет переменной-членом.Это означает, что это определенное свойство этого экземпляра переменной.Это означает, что у вас может быть 50 получателей, которые имеют разные имена - все они могут иметь разные значения переменных-членов.С другой стороны, если у вас есть static var name, это означает, что вы не можете просто получить доступ к имени Гретера, но вам нужно получить доступ к значению Greeter.name.Находясь внутри класса (и его потомков), вы сможете получить доступ к имени как к локальной переменной, а остальной мир не может просто сделать:

var g:Greeter = new Greeter(); 
g.name = "foo"; //this would cause an error

Вместо этогоони должны обращаться к нему как к свойству класса:

Greeter.name = "foo"; 
var g:Greeter = new Greeter(); 
trace(g.hasOwnAttribute("name")); //false
1 голос
/ 21 июня 2011

Я считаю, что в Action Script не имеет значения, где в классе объявлены переменные.В то время как большинство языков стиля C, включая AS, не требуют объявлять переменные перед использованием, языки стиля Pascal заставляют вас делать это.

var name виден всем методам класса Greeter, но если бы он был объявлен внутри конструктора (локальная переменная), он был бы доступен только в рамках конструктора.Если вы объявите локальную переменную, она не будет доступна другим членам класса.В этом случае var name объявляется как переменная класса, которая предназначена для отображения всем членам класса (под членами я подразумеваю методы, конструкторы и свойства).Кроме того, поскольку это общедоступная переменная класса, она доступна для другого кода, который ссылается на экземпляр класса Greeter.

Большинство компиляторов инициализируют примитивные переменные (например, Booleans - false, а Ints - 0).Непримитивные типы, однако, остаются нулевыми.Вы должны рассматривать конструкторы как некоторую логику, которая готовит новый экземпляр объекта для использования.Обычно он не должен выполнять другой код, кроме инициализации.

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