Object Oriented Programming
“Overloaded” Constructor via static method
Constructor overloading is not available in As3.
In order to provide a different way to retrieve an instance of a class, a public static
method can be provided to serve as an alternative “constructor”.
An example for that is flash.geom.Point
, which represents a 2D point object.
The coordinates to define the point can be
-
cartesian in the regular constructor
public function Point(x:Number = 0, y:Number = 0)
example usage:
var point:Point = new Point(2, -.5);
-
polar in a static method
public static function polar(len:Number, angle:Number):Point
example usage:
var point:Point = Point.polar(12, .7 * Math.PI);
Because it is not an actual constructor, there’s no
new
keyword.
set & get functions
To ensure encapsulation, member variables of a class should be private
and only be accessible to public
via public get
/set
access methods. It is a common practice to prefix private fields with _
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;
}
Sometimes you don’t even need to create a private
field for a get
/set
pair.
For example in a control like a custom radio group you need to know which radio button is selected, however outside the class you need just a way to get
/set
only the selected value:
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;
}
}
}
Packages
Packages are bundles of classes. Every class must be declared within a package using the package
statement. The package
statement is followed by the name of your package, or followed by nothing in the case of adding classes to the top-level package. Sub-packages are created using dot (.
) delimitation. The package statement is followed by a block which will contain a single class
definition. Examples:
package {
// The top level package.
}
package world {
// A package named world.
}
package world.monsters {
// A package named monsters within a package named world.
}
Packages should correlate to the file structure of the classes relative to the source root. Assuming you have a source root folder named src
, the above could be correctly represented in the filesystem as:
src
TopLevelClass.as
world
ClassInWorldPackage.as
AnotherClassInWorldPackage.as
monsters
Zombie.as
Method overriding
When you extend
a class, you can override
methods that the inherited class defines using the override
keyword:
public class Example {
public function test():void {
trace('It works!');
}
}
public class AnotherExample extends Example {
public override function test():void {
trace('It still works!');
}
}
Example:
var example:Example = new Example();
var another:AnotherExample = new AnotherExample();
example.test(); // Output: It works!
another.test(); // Output: It still works!
You can use the super
keyword to reference the original method from the class being inherited. For example, we could change the body of AnotherExample.test()
to:
public override function test():void {
super.test();
trace('Extra content.');
}
Resulting in:
another.test(); // Output: It works!
// Extra content.
Overriding class constructors is a little bit different. The override
keyword is omitted and accessing the inherited constructor is done simply with super()
:
public class AnotherClass extends Example {
public function AnotherClass() {
super(); // Call the constructor in the inherited class.
}
}
You can also override get
and set
methods.
getter and setter
Getters and setters are methods that are behaved like properties. it means they have function structure but when used, they are used same as properties:
Structure of getter functions:
they should have get
keyword after function
keyword and before function name, with no argument, a return type specified and must return a value:
public function get myValue():Type{
//anything here
return _desiredValue;
}
Syntax:
to get the value from a getter,the syntax is the same as getting a value from a property(no parens ()
are used).
trace(myValue);
Structure of setter functions:
they should have set
keyword after function
keyword and before function name, with one argument, and no value return.
public function set myValue(value:Type):void{
//anything here
_desiredProperty=value;
}
Syntax:
to set the value of a setter,the syntax is the same as setting a value to a property(using equal sign =
then value).
myValue=desiredValue;
setting a getter and setter for one value:
Note: if you create only getter or only setter with a name, that property would be read-only or set-only.
to make a property both readable and setable, should create a getter and a setter with:
1.the same name.
2.the same type(type of return value for the getter and type of input value(argument) for the setter,
Note: getters and setters should not have a name same as other properties or methods .
Usage of getters and setters:
Using getters and setters rather than normal properties has many pros:
1.making read-only or set-only properties:
for example number of children in a display object. it can’t be setable.
2.accessing private properties:
an example:
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.when some change is required after setting a value:
in this example, changing this property must be notified:
public static function set val:(input:Type):void{
_desiredProperty=input;
notifyValueChanged();
}
and many other usages