2010年7月2日 星期五

Flex_靜態變數/多型/IS用法

第二個重點,就是快速的將剩下的程式觀念完備,有三個重點:1.靜態變數、2.IS的用法、3.多型。

1.靜態變數Static
舉個課堂上的例子,在撰寫類別程式的時候,往往會有一個簡單的需求,就是希望去計算當物件被new起來的時候,可以去計算各數,比如說:寫了一個視窗的物件來裝載其他程式,每當使用者按下時,就產生一個新的功能視窗給使用者操作,那如果希望知道被開了幾個視窗,我們可能會在開視窗的函式利用一個整數型態去紀錄。

像類似上面的功能,就可以透過靜態變數來完成,那什麼是靜態變數呢?在程式執行的概念其實很單純,也就是設定一個當物件被new起來的時候,不會被複製到記憶體空間的變數,也就是說在new起來的實體上不會含有這個變數,越寫越模糊還是畫圖吧。

由上圖可以看出,若是使用一般的變數宣告(public var num:int;),則在物件被new起來時會將所有屬性與方法複製一份出來,但若使用靜態宣告(static public var num:int;),則靜態部份不會被複製到new起來的物件,所以要怎麼樣達成自動計數的功能,只需要在宣告靜態變數後,於建構函式執行增加數量的程式碼即可。那要如何使用?因為他沒有被複製到new起來的實體物件,所以使用方法就是直接對類別名稱去取得靜態變數或靜態方法,也就是class名稱.變數名稱(product.num),可以看下圖的第三點。

2.IS的用法
老師將這些內容當作整個課程的前導,也代表著後來的程式撰寫需要許多物件導向的觀念,需要撰寫很多的類別檔案來進行拼裝,那可能會碰到一個問題,要如何判斷物件類別或是該物件是否含有相對應的方法,這就必須要使用多型的觀念與IS的用法,先講用法:
判斷是否為某一種類別:if(item is Book)
判斷是否有引用相關介面:if(productArray[i] is InfoSummary)

到這裡應該會有一個疑問?如果Item就是book,也就是說先宣告了var item:Book;,為什麼會有判斷類別的需求?所以這就需要引入多型的概念。

3.多型
多型,顧名思義很多種型態,為什麼一個類別會有很多種型態,可以從之前建立的product、Monitor與Book三個類別來做想像:

Montior與Book都需要Product的品牌屬性(brand),所以繼承了商品的類別,延伸出螢幕與書本的類別,那麼我們就可以視螢幕及書本為一種商品類別,也就是說螢幕除了是螢幕類別以外也是商品類別(好像廢話),所以當我們讓一個矩陣裡面裝有各種各類的螢幕、書本、腳踏車或杯子等,都可以視為裡面裝的都是商品類別。

這樣IS可能就開始有意義了,因為螢幕有螢幕及商品兩種型態,要去承接時,我們可以宣告一個商品的變數(var item:Product)來負責代表所有的東西,但在實際分類時卻需要判斷他屬於哪一個子類(if(item is Book))。所以就會像下面的程式碼,雖然Item為商品類別,但是卻可以裝載螢幕或是書本,再藉由IS判斷。

就這樣相關的程式概念也算是首次完整的上過一次,或許還有很多觀念不夠熟析或是理解偏差,但是現在學東西都覺得要一次通透其實很困難,慢慢真的在專案上面應用以後會更有感覺,或許下次有機會又聽到不同人闡述就有新的頓悟。

沒有留言:

張貼留言