前言:相信大家都聽說過女媧造人的故事,不過細節可能不會太清楚,我現在略述如下,您可要仔細聽哦,這和我們今天要聊的主題有莫大的關係呀。
女媧是一個人身龍尾的女神。Apsara Distributed File System開天闢地以後,也就在天地間到處遊歷。她雖然是神,可是也會寂寞的,望著平靜的水面裡自己美麗的倒影不勝唏噓。於是她便決定按照自己的形貌來捏泥人。女媧心靈手巧,不一會兒就捏好了好多的泥人。這些泥人幾乎和她一樣,只不過她給他們做了與兩手相配的雙腿,來代替龍的尾巴。女媧朝著那些小泥人吹口氣,那些小泥人便被灌注了活力,“活”了起來,變成了一群能直立行走、能言會語、聰明靈巧的小東西,女媧稱他們為“人”。女媧在其中一些人身上注入了陽氣——自然界一種好鬥的雄性要素,於是他們就成了男人;而在另外一些人身上,她又注入了陰氣——自然界一種柔順的雌性素,於是她們便成了女人。 女媧想讓人們遍布廣闊的大地,但她累了,做得也太慢了。於是,她想出一條捷徑。她把一根繩子放進河底的淤泥裡轉動著,直到繩的下端整個兒裹上一層土。接著,她提起繩子向地面上一揮,凡是有泥點降落的地方,那些泥點就變成了一個個小人。女媧就這樣創造了布滿大地的人們。
這個故事可謂是蘊涵了極深刻的程式文法規則,大家看完我下面的分析後,一定會相信故事的作者沒準是遠古時代的程式員呢!
<代碼看起來很長,是我加了詳細的注釋的緣故>
1、類:如果女媧屬於一個類的話,可以稱之為"神"。代碼錶示為:
--神.as開始--
class 神{//class :定義'類'的關鍵字,描述一組具有共性的對象的特徵 static var 類別:String="神"; //static :定義'類變數'或'類方法'的關鍵字,它描述一組類的整體屬性或方法。在這裡表示,所有的神的都可稱為"神"。 static var 所屬:Object =神;//表示神歸誰管啦,中國遠古的神好象沒有什麼附屬關係哦。 public var 善惡:String; //public :定義'公開'屬性或方法的關鍵字,它描述類的可以供外部對象訪問的屬性或方法。 private var __姓名:String; //private :定義'私人‘屬性或方法的關鍵字,它描述類的需要封裝的屬性或方法, //表現為它定義的變數或方法只可以被類或子類內部的方法訪問(調用). //下面會詳細說明用private的理由的. private var __形體:String;//在變數名字前加"__"僅標誌它是具有擷取/設定方法的屬性. private var __性別:String; public function set 姓名(n:String):Void{ //set:動作指令碼 2.0中隱式設定類相關屬性的關鍵字.下面會詳細說明 __姓名=n;//類內部的方法可以訪問私人屬性'__姓名' } public function get 姓名():String{ //get:動作指令碼 2.0中隱式擷取類相關屬性的關鍵字.下面會詳細說明 var n:String="偉大的神"+__姓名;//類內部的方法可以訪問私人屬性'__姓名' return n; } public function set 形體(x:String):Void{ __形體="神奇的"+x; } public function get 形體():String{ return __形體; } public function set 性別(n:String):Void{ if(n=="男"||n=="女"){ __性別=n; } } public function get 性別():String{ return __性別; } function 神(sh:String,n:String,x:String,s:String){ //建構函式,是串連類和執行個體的紐帶,它接受外部設定的參數, //對即將產生的執行個體進行初始化.它的表現就是名稱與包含它的類的名稱相同.其實我真的認為...它可以比喻為'子宮'的.. //sh:善惡,n:姓名,x:形體,s:性別 善惡=sh;//為善惡屬性直接賦值。 姓名=n;//調用'set 姓名'方法為'__姓名'屬性賦值。 形體=x;//調用'set 形體'方法為'__形體'屬性賦值。 性別=s; //調用'set 性別'方法為'__性別'屬性賦值,在賦值之前會先判斷s是否為'男'或'女'。 //對賦值進行必要的控制,是隱式設定屬性的一個優勢。 } public function 寂寞():Void{ trace("\"自己好孤單啊,有個人陪陪我多好啊!\""); //為什麼不去[維藝--Flash]論壇?呵呵,做個廣告啦! } public function 創造(o:String):Object { //o:創造的目標 if(o=="人"){ var 泥人=捏泥人(); var 氣=["陽","陰"]; var r=Math.floor(Math.random()*2);//得到一個隨即數字,或0或1 var 隨即氣= 氣[r]; var 人=吹口氣(泥人,隨即氣);//類內部的方法可以調用'私人'方法'吹口氣' 命名(人,"人");//女媧稱他們為'人'... return 人; } //if ... 當然神還具備其它的創造本領,這裡略~ } public function 捏泥人():Object { trace("捏泥人..."); var 泥人=new Object(); 泥人.形體="人身人腿";//據上面神話所述,女媧是'人身蛇尾'... trace("一個泥人製作完畢!"); return 泥人; } public function 命名(o:Object,n:String){ //o:待命名的對象,n:名稱 o.類別=n; trace("一個人誕生了!"); } private function 吹口氣(o:Object,s:String):Object{ //o:泥人,s:氣 //這個方法確實是神私人的方法啦,我一直都不理解的,如果能吹口氣吹出銀子來... trace("吹口氣..."); //--泥人具有了以下本領-- o.直立行走=function(){ trace("打架摔交中..."); } trace("泥人學會直立行走!"); o.能言會語=function(){ trace("談情說愛中..."); } trace("泥人學會語言!"); o.聰明靈巧=function(){ trace("坑蒙拐騙中..."); } trace("泥人學會思考!"); //呵呵 if(s=="陰"){ //如果注入的是陰氣 o.性別="女"; }else if(s=="陽"){ o.性別="男"; } //else if 又陰又陽 then 人妖~~ trace("泥人性別是"+o.性別+"!"); trace("泥人具備了靈魂!"); return o; }}
--神.as結束--
到這裡我們的"造神運動"就告一階段了,該看看我們的神的威力啦!
--女媧造人.fla開始--
//在第一楨上寫代碼:var 女媧=new 神("善","女媧","人身蛇尾","女");//new:產生執行個體的關鍵字,它先建立一個初始時匿名的新對象,再用建構函式設定新對象的特性,//最後返回新對象的記憶體位址。在這裡新誕生的'神'的記憶體位址賦給了'女媧'變數。trace(女媧.姓名+"是一位"+女媧.形體+女媧.性別+神.類別);//調用女媧的'get 姓名'方法,返回'偉大的神女媧'。對返回的屬性值進行必要的控制,是隱式擷取屬性的一個優勢。//比如,你的老闆叫張三,卻常被稱為'張總',這也是經過必要的控制之後得到的結果。//'張三'這個名字只有他的自己人才使用哦!所以說生活中有很多事情也可用'私人屬性'來解釋的~trace("她是"+女媧.善惡+神.類別);//直接返回女媧的善惡屬性值。trace("一天,她覺得");女媧.寂寞();trace("於是,她開始");女媧.創造("人");
--女媧造人.fla結束--
現在測試一下吧,看看會產生什麼驚天動地的大事吧!
--測試影片開始--
偉大的神女媧是一位神奇的人身蛇尾女神
她是善神
一天,她覺得
"自己好孤單啊,有個人陪陪多好啊!"
於是,她開始
捏泥人...
一個泥人製作完畢!
吹口氣...
泥人學會直立行走!
泥人學會語言!
泥人學會思考!
泥人性別是男!
泥人具備了靈魂!
一個人誕生了!
--測試影片結束--
呵呵,到此為止,我們的女媧造人的故事就講述了一半了,接下來就該女媧如何用繩子甩泥點造人啦(這的確比一個一個手工捏要利索多了),也就是類的繼承。希望不會讓大家等太久哦:)
前言:在上篇中談到女媧不甘寂寞,用泥土捏出了一個個會走動、具靈氣的"人",可是忘了交代一下"人" 的才能到底如何。在女媧開始大批量造人之前先給我們"人"個舞台,讓他展現一下自己的才能吧!
--女媧造人.fla 開始--
var 女媧:神=new 神("善","女媧","人身蛇尾","女");trace(女媧.姓名+"是一位"+女媧.形體+女媧.性別+神.類別);trace("她是"+女媧.善惡+神.類別);trace("一天,她覺得");女媧.寂寞();trace("於是,她開始");var 原始人:Object=女媧.創造("人");//將創造出來的"人"賦值給變數'原始人',以後就可以通過'原始人'訪問他的屬性與方法。trace("----原始人開始展示自己的才能----");trace("原始人是"+原始人.性別+原始人.類別);trace("原始人的形體是"+原始人.形體);trace("原始人會直立行走,現在他(她)在:");原始人.直立行走();trace("原始人能言會語,現在他(她)在:");原始人.能言會語();trace("原始人聰明靈巧,現在他(她)在:");原始人.聰明靈巧()
--女媧造人.fla 結束--
我們人的表現如何呢?現在測試一下:
--女媧造人.fla 測試開始--
偉大的神女媧是一位神奇的人身蛇尾女神
她是善神
一天,她覺得
"我好孤單啊,有個人陪陪我多好啊!"
於是,她開始
捏泥人...
一個泥人製作完畢!
吹口氣...
泥人學會直立行走!
泥人學會語言!
泥人學會思考!
泥人性別是女!
泥人具備了靈魂!
一個人誕生了!
----原始人開始展示自己的才能----
原始人是女人
原始人的形體是人身人腿
原始人會直立行走,現在他(她)在:
打架摔交中...
原始人能言會語,現在他(她)在:
談情說愛中...
原始人聰明靈巧,現在他(她)在:
坑蒙拐騙中...
--女媧造人.fla 測試結束--
看到測試結果,你的感受如何呢?這個這個嘛,還是'人之初,性本惡'吧?
廢話少說,言歸正傳。話說女媧想讓人們遍布廣闊的大地,但象她這樣一個一個捏制下去希望實在渺茫啊。而且我們也看到了,其實每個泥人的樣子雖然各不相同,但靈魂卻是相似的,都是女媧的一口氣使然。如果每個人都需要從女媧那裡來那麼一口,不把女媧累死也得元氣大傷吧!那麼女媧該怎麼辦呢?傳說裡說女媧拿了根繩子甩啊甩的就造出了很多人,看來得從這根'繩'子著手了.
這根繩子如此不一般,我認為是女媧把造人的模版傾注其中的結果。傳說裡又說,女媧是'按照自己的行貌'造的人,可以肯定'人'一定是從神那裡繼承了不少的特性吧。
--人.as開始--
class 人 extends 神 {//extends:定義類與類之間繼承關係的關鍵字,子類對父類的特性可以保留或揚棄。 static var 類別:String = "人"; static var 所屬:Object = 神; //看到沒,人是歸神所管的哦 static var 氣:Array = ["陽", "陰"]; static function 設定性別():String { var 隨即氣 = 人.氣[Math.floor(Math.random()*2)]; if (隨即氣 == "陰") { return "女"; } else if (隨即氣 == "陽") { return "男"; } } public function set 形體(x:String):Void { //畢竟人和神的形體有很大的不同,神的形體千變萬化, //人的形體卻大體是相似的,所以子類重寫了父類的 'set 形體()'方法. //x:形體的狀況,如是怎樣的身材等等 if (x == undefined) { x = "平常"; } //如果沒有提供'形體'的詳細描述,那麼用預設值'平常'。 __形體 = x+"人體"; } public function get 形體():String{ //這個方法有點奇怪,本來應該直接繼承就可以了,但卻不得不再寫一遍,原因不明。或者set 與 get 要配對出現? return __形體; } function 人(x) { //人的誕生無法和神相比啦,重寫建構函式 //x:形體 //與神相比,人的建構函式只有'形體'一項參數,因為人的善惡跟後來的成長過程有關, //性別由自然規則來定,姓名是後來由別人給命名的...只有身體是與天俱來的 //善惡=undefined 這裡寫出來,是提醒大家善惡現在其實是undefined的 //姓名=undefined 形體 = x; 性別 = 人.設定性別(); //調用類方法來初始化性別 trace("人誕生了!"); } //下面的是繼承來的方法 public function 寂寞():Void { //寂寞者,人神皆然。不過'人'對'神'的寂寞有所拓展 super.寂寞(); //super:指向父類對象的關鍵字,因為'人'與神的寂寞有相同的地方,所以這裡先調用'神'的‘寂寞’方法。 trace("哪怕是陪我聊聊天也行哦!"); //神會把'寂寞'轉化為'創造',人卻把'寂寞'轉化為'有聊'~~ } public function 創造(o:Object):Object { //人是沒有神那麼偉大的創造力...重寫'創造'方法 if (o == "火") { var o = new Object(); o.名稱 = "火"; o.烤 = function(oo:Object) { trace(oo+"烤熟了!"); }; trace("發明鑽木取火!"); return o; } //其他的創造能力...略 } //public function 捏泥人()... 人和神的 ‘捏泥人’沒啥區別,完全繼承之 public function 吹口氣(o:Object) { //由私人方法成為公有方法 //唉,一般來說子類對父類的功能都是有所拓展或增強,唯獨由神到人有點特別呀, //拓展的只是些皮毛無聊的小功能,象這‘吹口氣’的大本領就沒繼承來!要是吹口氣吹出銀子來... if (o == undefined) { //如果無東西可吹 trace("哎,這覺睡得好長啊"); //等於是打個哈欠吧 } else if (o == " 蠟燭") { trace("蠟燭滅了"); //吹吹蠟燭~ } else if (o == this) { //this:表示對象自身的關鍵字。 //如果吹的對象是自己 trace("哪裡哪裡,我也是略懂一二...你有什麼要請教的?"); //唉,我也難免吹吹自己的~ } else if (o instanceof 人.所屬) { //如果吹的對象是人類的主宰的話 trace("爹親娘親沒有"+o.姓名+"親!"); //得 ,這又是在拍了~ } } //下面是人自己的方法 public function 直立行走() { trace("打架摔交中..."); } public function 能言會語() { trace("談情說愛中..."); } public function 聰明靈巧() { trace("坑蒙拐騙中..."); }}
//--人.as結束--
現在"造人運動"也告一段落了,讓我們看看收效如何吧:
--女媧造人.fla--
(在原代碼後附加)
var 遠古人=new 人("美麗的");遠古人.姓名="遠古人";//為執行個體自己的姓名屬性賦值遠古人.打獵=function(o:String):Void{ trace("射殺一隻"+o+"!");}//為執行個體定義自己的方法trace("----遠古人開始展示自己的才能----");trace(遠古人.名字+"是"+遠古人.性別+人.類別);trace(遠古人.名字+"的形體是"+遠古人.形體);遠古人.寂寞();trace("遠古人會直立行走,現在他(她)在:");遠古人.直立行走();trace("遠古人能言會語,現在他(她)在:");遠古人.能言會語();trace("遠古人聰明靈巧,現在他(她)在:");遠古人.聰明靈巧();遠古人.捏泥人();遠古人.吹口氣();遠古人.吹口氣("蠟燭");遠古人.吹口氣(遠古人);遠古人.吹口氣(女媧);遠古人.打獵("鹿");
--女媧造人.fla 結束--
如果你想要看看這位遠古人的表現如何,不妨自己測試。到此為止,我們的故事就快講完了。女媧現在造人就非常簡單了,只需要"new 人()"就可以了,再不用捏個泥人吹口氣了。如果精神充沛的話就"new 人('健康的')",如果體力不支的話就"new 人('軟弱的')"。如果你瞭解Action 1.0文法的繼承機制的話,一定知道類中的執行個體方法是寫在類的"prototype"(即原型)上的,這樣可以實現由類建立的執行個體共用相同的方法。在我們剛才建立的類中,由"public"或"private"關鍵字修飾的方法其實也是寫在"prototype"上的。所以說,現在女媧不再需要在每個"人"身上都定義一遍"方法",也就是對每個人都"吹口氣"了。