Flash/Flex學習筆記(8):ActionScript3.0中的面對對象

來源:互聯網
上載者:User

首先要習慣AS3.0的幾個BT約定:

1.一個.as檔案中,只能定義一個類
2.類名稱必須與.as的檔案名稱相同
3.類定義中必須要有package包聲明
4.一個類最多隻能有一個建構函式

5.包package的路徑/名稱約定:

這個初次接觸時感覺有點小複雜,這樣描述吧:

如果您在定義一個類時,package的聲明指定了名稱,比如 package jimmy{ public class MyClass{...}},那麼也就意味著需要對它引用的fla/as檔案同級目錄下,必須要有jimmy目錄,而且jimmy目錄下必須要有MyClass.as檔案,而且MyClass檔案中定義的類名必須為MyClass

然後你再引用該類時,必須匯入該包

import jimmy.MyClass;

然後才能引用比如: var mycls:MyClass = new MyClass();

簡單來講,就是package名必須與目錄名準確匹配。

這裡還有一種特殊情況:

假如定義的package名稱為jimmy.yang,根據上面的解釋,則同級目錄下必須要有jimmy.yang目錄,這是沒問題的,但是還可以這樣組織目錄結構,先建立一個jimmy目錄,然後再建立一個yang目錄,然後把as檔案放到jimmy/yang/目錄下,即:如果package名稱中有"點"時(比如package a.b),則目錄./a.b/ 與./a/b/效果相同,推薦用後者,這樣層次更分明

 

好了,開始定義第一個類:

package {public class Human {public function Human(){this._name = "暫無名字";trace("Human建構函式被調用!");}private var _name:String;public function get Name():String{return _name;}////僅本類及子類定義中可用(實際上這個編譯能過,但無法在子類中使用)//protected function set Name(n:String):void{//this._name = n;//}public function SetName(n:String):void{this._name = n;}//屬性 set get樣本private var _sex:Boolean public function set Sex(v:Boolean):void{_sex = v;}public function get Sex():Boolean{return _sex;}public function Hello():void{trace(_name + " say:Hello World!");HiChildren();//測試在本類中調用受保護方法}//受保護方法protected function HiChildren():void{trace(_name + ":HiChildren");}//靜態方法public static function WhoAmI():String{return "This is a Human Class"}}}

 上面示範了構造器,屬性(set/get),靜態方法,受保護方法,注意:AS3中不支抽象類別

package {public class Man extends Human {public function Man(n:String):void {super();SetName(n);super.Sex=true;trace("Man建構函式被調用!");HiChildren();//調用父類的受保護方法}//覆蓋父類的性別設定函數public override function set Sex(v:Boolean):void {//Sex = true;//既然已經是男的,肯定是男的,這裡就用不著了,除非咱們的系統支援"變性"trace("無法修改Man的性別");}//protected override function set Name(n:String):void{////Name = n;//報錯:對Name的引用有歧義//}public function ChaseGirls():void{trace(Name + "正在泡妞...");}}}

 上面示範了類繼承、覆寫,下面調用這二個類測試一番:

var h:Human = new Human();trace(h.Name);h.Sex = true;trace(h.Sex);trace(Human.WhoAmI())h.Hello();//h.Name = "菩提樹下的楊過";//這裡會報錯:屬性唯讀,因為Name的set方法受保護//h.HiChildren(); //同理無法調用 var _man:Man = new Man("菩提樹下的楊過");_man.Sex = false;trace("_man的性別:" + _man.Sex);//trace(Man.WhoAmI());//靜態方法將不被繼承_man.Hello();//_man.HiChildren();//受保護方法無法在子類執行個體中使用_man.ChaseGirls();

輸出結果:
Human建構函式被調用!
暫無名字
true
This is a Human Class
暫無名字 say:Hello World!
暫無名字:HiChildren
Human建構函式被調用!
Man建構函式被調用!
菩提樹下的楊過:HiChildren
無法修改Man的性別
_man的性別:true
菩提樹下的楊過 say:Hello World!
菩提樹下的楊過:HiChildren
菩提樹下的楊過正在泡妞...

另外:做為符合ECMA規範的語言,ActionScript同樣具有類似JavaScript的動態語言能力,我們把Human.cs再改一下:

package {public dynamic class Human {public function Human() {trace("Human建構函式被調用!");}public function toString():String {return "This is a Human instance!";}}}

 注意dynamic關鍵字,加上這個後,Human就具備了動態修改屬性的能力,看下面的測試代碼:

var h:Human = new Human();h.age = 10;h.name = "菩提樹下的楊過";h.Say = function(){trace(h.name + ":Hello!" );}trace(h.toString());trace(h.age);trace(h.name);h.Say();var h2:Human = new Human();trace(h2.age);//輸出undefiend

輸出結果:

Human建構函式被調用!
This is a Human instance!
10
菩提樹下的楊過
菩提樹下的楊過:Hello!
Human建構函式被調用!
undefined

如果一個類不想被繼承,可以用final關鍵字標識,通常可以把一些輔助方法以static方式定義在final標識的類中,構成自己的工具類庫(有點象c#中的靜態類)

package {public final class MyUtils {public static function Test(s:String):String {trace(s);return s;}public static function Now():String {trace(new Date());return new Date().toLocaleString();}}}

調用:

MyUtils.Test("hello test");MyUtils.Now();

用final + static組合還能實作類別似枚舉的效果:

package {public final class LOGIN_REG_ERROR {public static const USERNAME_EXISTS = "使用者名稱已存在";public static const PASSWORD_ERROR = "密碼錯誤";public static const USENAME_ERROR = "使用者名稱錯誤";//...}}

使用樣本:

var _loginResult:String;if (_loginResult==LOGIN_REG_ERROR.USERNAME_EXISTS) {trace("使用者名稱已存在!");}

AS3.0還支援介面,看下面的代碼

package {public interface IFly {function Fly():void;}}
package {public class Duck implements IFly {public function Duck() {trace("來來,我是一隻鴨子...");}public function Fly():void{trace("請叫我小飛俠,謝謝!")}}}

最後看下原型鏈prototype:在javascript中正是得益於prototype才實現了很多驚人的應用,同樣在as3.0中也存在原型鏈,所有動態屬性的繼承都可以通過原型繼承實現,不過要注意的是:如果你準備對一個類進行prototype擴充以實現原型繼承,則該類必須標識為dynamic,下面是範例程式碼:

var d:Duck = new Duck();d.Fly();Duck.prototype.Swim = function(){trace("正在遊泳...請迴避(裸泳?)");}d.Swim(); //請先將上一段代碼中的Duck類定義加上dynamic關鍵字,否則本行代碼無法執行

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.