AS3笔记(10),namespace之二(访问控制)

本文为frank的学习笔记,转载请注明原文链接
更多笔记请参看:http://www.2solo.cn/log/article.asp?id=87

在As3中,Namespace (命名空间)类包含用于定义和使用命名空间的方法和属性.其中使用方案有以下三 中:

  • XML 对象的命名空间
  • 用于区分方法的命名空间
  • 用于访问控制的命名空间

XML 对象的命名空间方法已经在前一篇笔记中做了小结,这篇blog我准备小结一下后两者,我综合在一 起,称为"Namespace控制方法和属性的访问".

通过帮助里的文档,我们可以发现,namespace其实类似public,private,,internal,protected,可以用 于自定义函数和属性的作用域.

以下为namespace的基本用法,摘自帮助:

使用命名空间时,应遵循以下三个基本步骤。第一,必须使用 namespace 关键字来定义命名空间。例如,下面的代码定义 version1 命名空间:

namespace version1;
            

第二,在属性或方法声明中,使用命名空间(而非访问控制说明符)来应用命名空间。 下面的示例将一个名为 myFunction() 的函数放在 version1 命名空间中:

version1 function myFunction() {}
            

第三,在应用了该命名空间后,可以使用 use 指令引用它,也可以使用 该命名空间来限定标识符的名称。下面的示例通过 use 指令来引用 myFunction() 函数:

use namespace version1;
            myFunction();
            

您还可以使用限定名称来引用 myFunction() 函数,如下面的示例所示:

version1::myFunction();

下例通过定义和引用自定义的namespace实现了同名方法的分类访问.

/*@
Author:frank
Site:www.2solo.cn
Date:2008.02.08
Info:Namespace 函数控制测试
*/

package {
    import flash.display.Sprite;

    public class nsFunctionSample extends Sprite {
        public function nsFunctionSample() {
            var vocab:sayHello = new sayHello();
            trace(vocab.hello());
            trace(vocab.FR::hello());
            trace(vocab.EN::hello());
        }
    }
}
namespace FR
namespace EN
class sayHello {
    public function sayHello() {
        trace(FR.uri);
    }
    public function hello():String {
        return "你好";
    }
    EN function hello():String {
        return "hello";
    }
    FR function hello():String {
        return "bon jour";
    }
    public function getNS() {
        return FR;
    }
}

上例的输出结果为:

nsFunctionSample.as$0:FR
你好
bon jour
hello

再见下例:
/*@
Author:frank
Site:www.2solo.cn
Date:2008.02.08
Info:Namespace 函数控制测试
*/

package {
    import flash.display.Sprite;

    public class nsFunctionSample extends Sprite {
        public function nsFunctionSample() {
            var vocab:sayHello = new sayHello();
            var ns=vocab.getNS();
            trace(vocab.hello());
            trace(vocab.ns::hello());
            //trace(vocab.EN::hello());
        }
    }
}
//namespace FR
//namespace EN
class sayHello {
    public namespace FR
    public namespace EN
    public function sayHello() {
        trace(FR.uri);
    }
    public function hello():String {
        return "你好";
    }
    EN function hello():String {
        return "hello";
    }
    FR function hello():String {
        return "bon jour";
    }
    public function getNS() {
        return FR;
    }
}

输出结果为:

nsFunctionSample.as$0:sayHello/FR
你好
bon jour


两个方法的区别在于FR和EN两个命名空间的定义域不同,从trace(FR.uri);可以看出,第一种方法定义的FR作用域为包内,而第二中方法定 义的作用域为类内部.从vocab.ns::hello()这句话可见,在第二中方法里,是先对FR命名空间做了引用才可 以访问到.而如果直接trace(vocab.EN::hello());则会报错.相比两种方法,第一种方法的使用比较方便. 可以通过use namespace来更方便的控制函数的访问.而第二种方法则对定义的控制更严谨.
下例子 为一个命名空间属性控制的实例,通过该实例可以延伸出程序版本控制的方法:

/*@
Author:frank
Site:www.2solo.cn
Date:2008.02.08
Info:Namespace 属性控制测试
*/

package {
    import flash.display.Sprite;

    public class nsPropertySample extends Sprite {
        public function nsPropertySample() {

            var vocab:sayHello = new sayHello("EN");
            trace(vocab.hello());
        }
    }
}
class sayHello {
    private namespace CN
    private namespace FR
    private namespace EN
    CN var word="你好";
    FR var word="bon jour";
    EN var word="hello";
    private var ns:Namespace;
    public function sayHello(str) {
        switch (str) {
            case "CN" :
                 ns=CN;
                 break;
            case "FR" :
                 ns=FR;
                 break;
            case "EN" :
                 ns=EN;
                 break;
        }

    }
    public function hello():String {
        return ns::word;
    }
}

两个范例的源文件:http://www.2solo.cn/upload/ns2_2soloDOTcn.zip.供参考.

[本日志由 frank 于 2008-02-18 11:57 PM 编辑]
文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
Tags: AS3笔记 as3.0 namespace
评论: 0 | 引用: 0 | 查看次数: 3263
发表评论
昵 称:
密 码: 游客发言不需要密码.
内 容:
验证码: 验证码
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.
字数限制 1000 字 | UBB代码 开启 | [img]标签 关闭