- 論壇徽章:
- 0
|
* 使用命名空間限制符"::"
如果一個命名空間定義在獨立的.as文件中,那么應(yīng)用這個命名空間時,在類定義之前必須加上相關(guān)的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;
}
定義一個應(yīng)用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();//可以注釋掉該行,否則會報錯。找不到相關(guān)的方法
//說明,即使在這里類中打開了noon空間
//也沒有辦法是用限定符來引用命名空間
//將Foo類中的use namespace noon;注釋去掉,則成功
kk.morning::hello();//輸出Good morning!,執(zhí)行成功
//將Foo類中的use namespace morning;注釋,則報錯
var aaa:Namespace = kk.getName();
kk.aaa::hello();//報錯:引用錯誤
//在Foo類中將use namespace night;注釋掉,則成功
//這說明不在Foo類中用use namespace night;將night命名空間初始化,
//用類方法返回的night命名空間也是沒有方法使用。
}
}
* 在類內(nèi)用命名空間:
如果這個命名空間是這個類 所獨有的,別的類中不需要應(yīng)用這個命名空間,那么就可以定義在類中。如果對類外部可見,可以使用private或者protected定義這個命名空間。如果這個命名空間需要被外部使用,那么類中必須通過某種方法將這個命名空間的應(yīng)用傳遞到外面,使用public(完全公開)或者internal(包內(nèi)公開)等訪問控制來定義這個空間。
例如:
class Foo{
public namespace good;
private namespace bad;
public function getName():Namespace{
//return this.bad;
//報錯;可見bad不是實例屬性
//return Foo.bad;
//這一行return Foo.bad卻可以執(zhí)行成功
//可見實際上命名空間是一個靜態(tài)成員
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的性質(zhì)了,類似靜態(tài)成員
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實質(zhì)上都是ActionScript 3中內(nèi)嵌的4個命名空間。
下面是需要注意的幾點:
1.不同的自定義命名空間中可有相同名字的成員,但是在4個命名空間中成員名字不能相同。這是ActionScript 3語法的限制,不可以有同名的public ,private ,protected,internal類成員。
2.自定義命名空間可以被引用,但是這4個命名空間中不可以被引用,除了public看起開可以使用限定符(::)引用之外其余的都不可以,但實際上,public的這種使用方法和普通的自定義命名空間的引用還是有區(qū)別的。
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成員當(dāng)然不會影響到自定義命名空間成員的訪問
}
}
}
* 重寫父類方法的的幾個條件
被關(guān)鍵字final定義過的實例方法不能被重寫,費雷的private不能被重寫。
必須用voerride關(guān)鍵字在行首標(biāo)明這是重寫。自類中被重寫的方法要和父類的方法有同樣的訪問控制,同樣的參數(shù)數(shù)目,同樣的參數(shù)類型,同樣的返回值類型。
本文來自ChinaUnix博客,如果查看原文請點:http://blog.chinaunix.net/u3/93876/showart_2163159.html |
|