软件频道>设计在线>Flash|平面网页Flash视频三维欣赏|设计专题教程素材| 群乐:Vista系统下载
您现在的位置: 天极网 > 软件频道 > 设计在线 > flash > Flash Actionscript知识:从AS2到AS3
全文

Flash Actionscript知识:从AS2到AS3

2007-05-17 07:31作者:flashlizi(蓝色理想)出处:论坛整理责任编辑:Shiny
P>  访问控制以及命名空间

  在AS2中我们已经知道有public, private 这2个访问控制符,在AS3中增加了internal和protected,并且对类、方法的访问控制更加严格,也更加合理和方便。另外,AS3中还增加了命名空间namespace,这样我们的访问控制更是灵活无比。(public和private 相信大家已经熟悉了,故不赘述)如有错误,敬请指正。

  internal 指明类、变量、常数、方法等在包package 级别可访问到。大家可能会问它和public与private的区别。public只能在package{}中才能使用,但public控制的类或方法可以在任何地方访问到;private只能在class{}中才能使用,它控制的类或方法仅能在相应的class中才能访问到。而internal可以在package{}外使用,但它只能作用于这个as文件内部。比如如下DDD.as中代码为:


package flashrek.example{
    public class DDD {
        function DDD() {
            var e:EEE=new EEE();

        }
    }
}
internal var internalStr:String="internalStr";
class EEE {
    function EEE() {
        trace(internalStr);
    }
}

  那么如下代码运行结果为:

import flashrek.example.DDD;
var d=new DDD();//输出:internalStr
trace(internalStr);//输出:错误Err

  可以看出,类DDD可以访问到package外的类EEE(默认就是internal,因此可以省略),而类EEE也可以访问到变量internalStr。而DDD.as文件外的其他地方就无法访问到EEE和internalStr了。

  和internal不同,protected只能应用于类class内。它指明变量、常数、方法等在类class级别可访问到。与private区别在于,protected指定的方法、变量等是可以继承的,在子类中能访问到他们。

  AS3中还引入了命名空间namespace。当你有一些有特殊用途的方法分布在不同的包package里,你想要这些方法在所有package里都可以应用,但你又不想把这些方法设置为public。这个时候,namespace就能达到你的目的。

  首先你要定义一个namespace,(flashrek.as):

package flashrek.example{
    public namespace flashrek= www.webjx.com;
}

  然后在AAA.as文件中的代码为:

package flashrek.example{
    import flashrek.example.flashrek;
    public class AAA {        
        function AAA() {
            var b:BBB=new BBB();
            //flashrek::NStest();
        }
        flashrek function NStest() {
            trace("namespace test");
        }
    }
}
//package外的类、命名空间不能默认且只能是internal的,且仅能为在此package内使用。
//package外是不能使用public关键字的。
internal class BBB {
    function BBB() {
        trace("BBB");
        var c:CCC=new CCC();
    }
}
class CCC {
    function CCC() {
        trace("CCC");
    }
}

  接下来再看运行结果:

import flashrek.example.AAA;
import flashrek.example.flashrek;
var a=new AAA();
a.flashrek::NStest();
//输出:
BBB
CCC
namespace test

  由此我们可以看出,通过a.flashrek::NStest();这样的方法,我们可以访问到NStest方法,而其他地方是无法直接访问到这个方法的。

  在上例中大家发现,namespace很像一个类。确实有点像:)但namespace可以在package外,class内进行定义,而且也可以用public、internal等来进行访问控制。
比如去掉上例中的flashrek.as,而把AAA.as改成如下:

package flashrek.example{    
    public class AAA {        
        function AAA() {
            var b:BBB=new BBB();
            flashrek::NStest();
        }
        flashrek function NStest() {
            trace("namespace test");
        }
    }
}
//package外的类、命名空间不能默认且只能是internal的,且仅能为在此package内使用。
//package外是不能使用public关键字的。
namespace flashrek= "www.flashrek.com"
internal class BBB {
    function BBB() {
        trace("BBB");
        var c:CCC=new CCC();
    }
}
class CCC {
    function CCC() {
        trace("CCC");
    }
}

  在这里namespace flashrek 定义在package 外,它只能在package 级别访问到。因此用a.flashrek::NStest();是错误的。

共3页。 9 1 2 3 :
相关搜索:
关注此文读者还看过
热门关注
特别推荐
文章排行
本周
本月
最近更新
关于我们|网站律师|天极服务|电子杂志|RSS订阅|加入我们|网站地图
TMG
Copyright (C) 1999-2008 Chinabyte.com, All Rights Reserved 版权所有 天极网络
商务联系、网站内容、合作建议:010-82657868
版权声明 在线提交意见反馈 Powered by 天极内容管理平台CMS4i
经营性网站备案信息 网警备案 中国网站排名
天极传媒:天极网|比特网|IT专家网|IT商网|52PK游戏网|IT分众