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