| 月 | 日 | 年 | 時 | 分 |
24 /
Sun |
|
| 06 | 15 | 08 | 02 | 01 | 日 |
| AS3筆記-無知萬萬用 |
![]() |
![]() |
|||
![]() |
![]() |
OOP物件導向程式開發,是以真實世界的運昨邏輯化的產物,學習OOP的過程中,常常可以用真實世界的想像去裡解,透過學習的過程,去了解世界運作以及人生的道理,這樣想像起來會比較有趣.(希望是會啦)
從我們呱呱墜地,對這地球一無所知,我們還是可以吃飯長大,不需要知道地球是圓的還是方的.
胃不用知道血液怎麼流,管好他自己的消化,以及餓得時候發出訊號就好了.
所以上帝在設計哺乳類動物的時候,也是用物件導向的方式 – 寫好的OOP程式也可以用這樣去想.
基本上,寫任何一個物件,首先要規劃的是以他自己的角度來想,不需要知道很多他能力以外的事
比方說做一個menu好了,他並不需要知道他按了以後會發生什麼事情,光以一個menu的角度來說, 他被按下去的時候.只要告訴其他的元件:”我被按了什麼“就好了.至於按了會發生什麼事情,是秀一張圖,還是秀一段字,或撥音樂?這都不需要規範在這個menu裡面.
這樣一來,這個menu就可以被重複使用,這也是我們寫成class的主要目的,可以重複的使用這個menu而不需要因為每次有不同的作用而去改裡面的程式.
所以當這個menu被按了以後,在這menu裡面用parent去寫他要幹麻是非常不OOP的,例如
menuItem.addEventListener(MouseEvent.CLICK,doClick);
.
.
.
private function doClick(evt:MouseEvent):void{
parent.parent.showImage(a);
}
當你把code寫成這樣,會造成這個menu的class只可以去叫他的parent.parent去秀執行秀某張 image的動作,以後如果要在別的案子要拿同一個menu class來作其他的事情,就不可以用了,或者是要改code,這樣一來這個menu的用途就會很侷限,而且每次要用他就要規範一個showImage的funciton 在他的parent.parent.非常不合實際.
(寫成這樣乾脆寫在 flash IDE裡面的frame上算了, 何必花時間寫成Class)
所以,最好的方法是
//定義property
public static const MENU_CLICKED:String=”menuClicked”
.
.
//以下這行應該也會在某個method裡面,為何要這樣寫?
menuItem.addEventListener(MouseEvent.CLICK,doClick);
.
.
.
private function doClick(evt:MouseEvent):void{
dispatchEvent(new Event(MENU_CLICKED);
}
然後在外面的別的地方,可能是他的parent寫
.
.
//以下兩行應該也會在某個method裡面
menu:Menu=new Menu();
menu.addEventListener(Menu.MENU_CLICKED,doSomething);
/*
or
addEventListener(Menu.MENU_CLICKED,doSomething,true);
(capture phase)
*/
.
.
.
function doSomething(evt:Event){
doWhatEverYouLike();
}
這樣一來,透過dispatchEvent,你的Menu就可以用來作很多不同的事情,因為doWhatEverYouLike()並不包含在menu的class裡面,放在外面你可以改他的作用,所以這個menu以後就可以來做很多不同的事情.
至於如果是在很多個parent以外要聽這個MENU_CLICKED,可以用capture phase,來聽,這樣就不會有Event要一層一層傳的麻煩.
















(5 票, 平均: 4.60 / 5) << 請踴躍投票
One Message to “AS3筆記-無知萬萬用”
Leave a Message
pei 說:
3Q!
其實我之前看到
private function doClick(evt:MouseEvent):void{
dispatchEvent(new Event(MENU_CLICKED);
}
就會莫名其妙的感到害怕 但是這樣讀下來現在比較有信心使用了!