免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2505 | 回复: 0
打印 上一主题 下一主题

ActionScript 3 学习笔记(4)2010-01-28 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-01-28 14:44 |只看该作者 |倒序浏览
* 使用命名空间限制符"::"
    如果一个命名空间定义在独立的.as文件中,那么应用这个命名空间时,在类定义之前必须加上相关的use namespace的指令,否者没有办法在其他的类中使用命名空间的限定符来引用这个命名空间。
例如:
首先定义三个在独立.as文件中的命名空间morning,noon,night.
package com.temp.namespace{
    public namespace morning;
}
package com.temp.namespace{
    public namespace noon;
}
package com.temp.namespace{
    public namespace noon;
}
定义一个应用3个命名空间的Foo类;
package com.temp.namespace{
    import com.temp.namespace.*;
    use namespace morning;
    // use namespace noon;
    // use namespace night;
    public class Foo{
        morning function hello():void{
            trace("good morning!");
        }
        noon function hello():void{
            trace("Good noon!");
        }
        night function hello:void{
            trace("Good night!");
        }
        public function getName():Namespace{
            return night;
        }
    }
}
文档类
package com.temp.namespace{
    import flash.display.Sprite;
    import com.temp.namespace.*;
    use namespace noon;
    public class SampleOuterNamespace(){
        var kk:Foo = new Foo();
        kk.hello(); //输出 Good noon!,说明noon空间打开成功
        
        kk.noon::hello();//可以注释掉该行,否则会报错。找不到相关的方法
                         //说明,即使在这里类中打开了noon空间
                         //也没有办法是用限定符来引用命名空间
                         //将Foo类中的use namespace noon;注释去掉,则成功
     
        kk.morning::hello();//输出Good morning!,执行成功
                            //将Foo类中的use namespace morning;注释,则报错
     
        var aaa:Namespace = kk.getName();
        kk.aaa::hello();//报错:引用错误
                        //在Foo类中将use namespace night;注释掉,则成功
        
        //这说明不在Foo类中用use namespace night;将night命名空间初始化,
        //用类方法返回的night命名空间也是没有方法使用。
    }
}
* 在类内用命名空间:
    如果这个命名空间是这个类 所独有的,别的类中不需要应用这个命名空间,那么就可以定义在类中。如果对类外部可见,可以使用private或者protected定义这个命名空间。如果这个命名空间需要被外部使用,那么类中必须通过某种方法将这个命名空间的应用传递到外面,使用public(完全公开)或者internal(包内公开)等访问控制来定义这个空间。
例如:
class Foo{
    public namespace good;
    private namespace bad;
    public function getName():Namespace{
        //return this.bad;
        //报错;可见bad不是实例属性

        //return Foo.bad;
        //这一行return Foo.bad却可以执行成功
        //可见实际上命名空间是一个静态成员

        return bad;   //所以这里返回的实际上是Foo.bad;
    }
    good function hello():void{
        trace("Nice to meet you");
    }
    bad function hello():void{
        trace("who are you");
    }
}

package com.temp.namespace{
    import flash.display.Sprite;
    public class SampleInnerNamespace extends Sprite{
        public function SampleInnerNamespace(){
            var foo:Foo = new Foo();
            trace(Foo.good);
            //输出:SampleInnerNamespace.as$0:Foo/good
            //这就可以看穿定义在类中namespace的性质了,类似静态成员
            var nameisStatic:Namespce = Foo.good;
            foo.nameisStatic:hello();

            //trace(Foo.bad);会报错,私有命名空间不能访问
            //通过方法返回命名空间的引用,赋值给b
            var b:Namespace = foo.getName();
            foo.b::hello();
            //输出Who are you
        }
    }
}
* public , private ,protected ,internal实质上都是ActionScript 3中内嵌的4个命名空间。
下面是需要注意的几点:
   1.不同的自定义命名空间中可有相同名字的成员,但是在4个命名空间中成员名字不能相同。这是ActionScript 3语法的限制,不可以有同名的public ,private ,protected,internal类成员。
   2.自定义命名空间可以被引用,但是这4个命名空间中不可以被引用,除了public看起开可以使用限定符(::)引用之外其余的都不可以,但实际上,public的这种使用方法和普通的自定义命名空间的引用还是有区别的。
   3.自定义命名空间可以使用use namespace 指令打开命名空间,但是这4个命名空间不可以,其中虽然public也可以使用 use namespace public,但是这样的使用没有太大的意义。
namespace custom
class Person{
    public function hi():void{
        trace("Public:hi()");
    }
    custom function hi():void{
        trace("custom:hi()");
    }
    private function hello():void{
        trace("public:hello()");
    }
    custom function hello():void{
        trace("custom:hello()");
    }
}


package com.temp.namespace{
    import flash.display.Sprite;
    public class SamplePrority extends Sprite{
        public function SamplePrority(){
           var person = new Person();
           use namespace custom;
           //person.hi();
           //报错了。hi()有歧义,找到多个匹配的绑定
           //trace(person as Namespace);
           
           person.public::hi();
           person.custom::hi();

           person.hello();//输出 custom.hello();
           //正常访问到custom命名空间下的hello成员
           //private和protected成员当然不会影响到自定义命名空间成员的访问
        }
    }
}
* 重写父类方法的的几个条件
   被关键字final定义过的实例方法不能被重写,费雷的private不能被重写。
   必须用voerride关键字在行首标明这是重写。自类中被重写的方法要和父类的方法有同样的访问控制,同样的参数数目,同样的参数类型,同样的返回值类型。

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/93876/showart_2163159.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP