首页 > 网站 > WEB开发 > 正文

1.9.在ActionScript中设置变量的作用域

2024-04-29 18:53:26
字体:
来源:转载
供稿:网友
1.9.1.问题
我需要有些变量可公开访问但有些防止被外部访问。
1.9.2.解决办法
使用ActionScript的作用域修饰符。
1.9.3.讨论
无论是在ActionScript或在MXML文件中,变量都有各种作用域。组件中的私有变量和方法只可被其自身所访问,其他组件都无法访问。这样的定义很有用,这些数据只能有一个组件可以修改。当你设计一个复杂类时,最好是把那些外部组件不需要的变量属性设置为私有。

公共变量对任何对象都是可见的。应仔细考虑哪些属性是需要被外部访问以及如何限制访问这些属性以便创建一个更好的类结构,要时刻提醒程序员注意这一特性的重要性。对于继承类来说私有属性也是不可见的,只有定义它的类或组件才可见。最后protected变量只被定义它的类及其继承类所访问。

标记为私有的变量和函数只在定义它的类中可见,保护的在任何派生类中可见,如下面的例子使用了protected和private属性:
+展开
-ActionScript
package oreilly.cookbook{
public class Transport {
protected var info:Object;
private var speed:Object;
}
}

通过使用extends关键字,你可以共享类属性和方法给另一个类,在下面的例子中,Car类继承自Transport类,并继承了其非私有的所有属性和方法。Car不能访问Transport的私有属性,否则会提示错误信息"属性没有找到"。
+展开
-ActionScript
package oreilly.cookbook {
public class Car extends Transport {
public function set data(value:Object):void {
info = value;
speed = value.speed; /* this will throw an error because the speed
variable is private and access to it is not allowed to any other class */

}
}
}

Transport 类的protected属性可用于Car类,但是不能用于把它作为一个属性的其他类实例中。

两个类的任何公共属性都可以被其他类实例访问。任何指定了static关键字的类都可以不用实例化而直接访问其属性,换句话说,static定义的变量是所有类实例所共享的。把下面这一行加入到Car类中。
+展开
-ActionScript
public static const NUMBER_OF_WHEELS:int = 4;

现在也直接访问NUMBER_OF_WHEELS属性而不用类实例化,例如:
+展开
-ActionScript
import oreilly.cookbook.Car;
public class CompositionTest {
private var car:Car;
public function CompositionTest() {
trace("a Car object has "+Car.NUMBER_OF_WHEELS+" wheels");
}
}

到目前为止,所讲的变量作用域都是与类相关的,但是不仅仅是类属性,我们还可以在函数内创建或销毁变量,函数内的变量作用域只在函数体内有效。例如:
+展开
-ActionScript
private function processSpeedData():void {
var speed:int;
var measurement:String = "kilometers";
}

在这个函数体外面,变量speed是毫无意义的,也就是说函数内任何地方定义的变量其作用域都只能在函数体范围内。下面的代码能正确输出newCar对象:
+展开
-ActionScript
private function makeCars():void {
for (var i:int = 0; i<10; i++) {
var newCar:Car = new Car();
carArray.push(newCar);
}
trace(newCar);
}

newCar的引用在函数返回后便会失效。

ActionScript也支持final修饰符,指示编译器该方法不能被修改了。这个修饰符可以使你定义的方法不被修改和覆盖,例如,在Transport类中定义如下方法:
+展开
-ActionScript
public final function drive(speed:Number):void/* final and cannot be overriden in
any other class*/
 }

指示任何继承Transport的类将拥有此方法,其public作用域说明可被任何对象所访问,但是Transport子类无法重新定义它。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表