ActionScript 3
Объектно-ориентированное программирование
Поиск…
«Перегруженный» конструктор через статический метод
Перегрузка конструктора недоступна в As3.
Чтобы обеспечить другой способ получения экземпляра класса, может быть предоставлен public static
метод для использования в качестве альтернативного «конструктора».
Примером этого является flash.geom.Point
, представляющий 2D-объект. Координаты для определения точки могут быть
декартовой в регулярном конструкторе
public function Point(x:Number = 0, y:Number = 0)
пример использования:
var point:Point = new Point(2, -.5);
полярный по статическому методу
public static function polar(len:Number, angle:Number):Point
пример использования:
var point:Point = Point.polar(12, .7 * Math.PI);
Потому что это не фактический конструктор, нет
new
ключевого слова.
set & get функции
Чтобы обеспечить инкапсуляцию, переменные-члены класса должны быть private
и доступны только для public
помощью общедоступных методов get
/ set
access. Это обычная практика префикса частных полей с _
public class Person
{
private var _name:String = "";
public function get name():String{
return _name;
//or return some other value depending on the inner logic of the class
}
public function set name(value:String):void{
//here you may check if the new value is valid
//or maybe dispatch some update events or whatever else
_name = value;
}
Иногда вам даже не нужно создавать private
поле для пары get
/ set
.
Например, в элементе управления, таком как пользовательская радиогруппа, вам нужно знать, какой переключатель выбран, но вне класса вам нужен только способ get
/ set
только выбранное значение:
public function get selectedValue():String {
//just the data from the element
return _selected ? _selected.data : null;
}
public function set selectedValue(value:String):void {
//find the element with that data
for (var i:int = 0; i < _elems.length; i++) {
if (_elems[i].data == value) {
_selected = _elems[i];//set it
processRadio();//redraw
return;
}
}
}
пакеты
Пакеты - это пучки классов. Каждый класс должен быть объявлен в пакете с использованием оператора package
. За оператором package
следует имя вашего пакета или за ним ничего не следует добавлять в пакет верхнего уровня. Подпакеты создаются с использованием точечной ( .
) Делимитации. За операцией пакета следует блок, который будет содержать определение одного class
. Примеры:
package {
// The top level package.
}
package world {
// A package named world.
}
package world.monsters {
// A package named monsters within a package named world.
}
Пакеты должны соотноситься с файловой структурой классов относительно исходного корня. Предполагая, что у вас есть корневая папка источника с именем src
, вышеуказанное может быть правильно представлено в файловой системе следующим образом:
src
TopLevelClass.as
world
ClassInWorldPackage.as
AnotherClassInWorldPackage.as
monsters
Zombie.as
Метод переопределения
Когда вы extend
класс, вы можете override
методы, которые определяет унаследованный класс, используя ключевое слово override
:
public class Example {
public function test():void {
trace('It works!');
}
}
public class AnotherExample extends Example {
public override function test():void {
trace('It still works!');
}
}
Пример:
var example:Example = new Example();
var another:AnotherExample = new AnotherExample();
example.test(); // Output: It works!
another.test(); // Output: It still works!
Вы можете использовать ключевое слово super
для ссылки на исходный метод из унаследованного класса. Например, мы могли бы изменить тело AnotherExample.test()
на:
public override function test():void {
super.test();
trace('Extra content.');
}
В результате чего:
another.test(); // Output: It works!
// Extra content.
Переопределение конструкторов классов немного отличается. override
опущен, и доступ к унаследованному конструктору выполняется просто с помощью функции super()
:
public class AnotherClass extends Example {
public function AnotherClass() {
super(); // Call the constructor in the inherited class.
}
}
Вы также можете переопределить методы get
и set
.
геттер и сеттер
Getters и seters - это методы, которые ведут себя как свойства. это означает, что они имеют функциональную структуру, но при их использовании они используются так же, как и свойства:
Структура геттерных функций :
они должны иметь get
ключевое слово после function
ключевого слова и перед именем функции, без аргументов, типа возврата указан и должен возвращать значение:
public function get myValue():Type{
//anything here
return _desiredValue;
}
Синтаксис :
для получения значения из геттера, синтаксис такой же, как получение значения из свойства (no parens ()
).
trace(myValue);
Структура функций сеттера :
они должны set
ключевое слово после ключевого слова function
и перед именем функции, с одним аргументом и возвратом значения.
public function set myValue(value:Type):void{
//anything here
_desiredProperty=value;
}
Синтаксис :
для установки значения сеттера, синтаксис будет таким же, как установка значения для свойства (с использованием знака равенства =
затем значение).
myValue=desiredValue;
установка геттера и сеттера для одного значения :
Примечание: если вы создаете только getter или только setter с именем, это свойство будет доступно только для чтения или только для установки.
чтобы сделать свойство как читаемым, так и настраиваемым, должно создать геттер и сеттер с:
1. то же имя.
2. тот же тип (тип возвращаемого значения для геттера и тип входного значения (аргумент) для сеттера,
Примечание: геттеры и сеттеры не должны иметь имя, аналогичное другим свойствам или методам.
Использование геттеров и сеттеров:
Использование геттеров и сеттеров, а не обычных свойств имеет много преимуществ:
1. создание свойств только для чтения или только для установки:
например, количество детей в экранном объекте. он не может быть установлен.
2. Доступ к частной собственности:
пример:
private var _private:Type=new Type();
//note that function name "private" is not same as variable name "_private"
public function get private():Type{
return _private;
}
3. когда требуется некоторое изменение после установки значения:
в этом примере изменение этого свойства должно быть уведомлено:
public static function set val:(input:Type):void{
_desiredProperty=input;
notifyValueChanged();
}
и многие другие виды использования