使用 Google 搜尋本站文章:
首頁 | CodeCharge 討論板 | 部落格 | ASP.NET 電子書 | 所有文章 | 相簿 | News | 網站導讀 | 聯絡 Allen | 訂閱 RSS
Microsoft MVP 
since 2004 
 


換個方式來講 interface / OO

By Allen Kuo, 建立日期:2008/09/17 10:44 ,最後修改日期:2008/09/18 10:10
有網友問我為何要用 interface, 我將它記錄在這裡
    加入書籤: 收進你的MyShare個人書籤

問: 介面只實作方法, 那要在類別中實作方法,是嗎?

答: yes, 介面(interface)裡, 只定義了要實作哪些 mehotd, property, event, 稍後類別若宣告實作此 interface, 就需要根據 interface 裡的定義, 去寫出(實作)那些 method, property or event。

問: 介面只定義方法, 那為什麼不要直接在類別中直接寫方法,還要宣告介面,再繼承

答: 這麼說好了


二個class都有abc(), 但呼叫它們時, 二者,並沒有關係, 只能說它們剛好相同名稱而已

在以物件導向的觀念來 coding 時,常用到一個技巧, 就是 runtime 地切換 class , 程式叫用的通常是父類別, 或者是 interface, 盡量不要是明確的 class , 目前你一定還沒用到這類技巧, 例如 若我要發 email,可以寫成

就可以發 email 給此會員,若要發簡訊,可以寫成


就可以發手機簡訊給此會員

但, 問題來了, 客戶說,希望能由他自由切換, 但以後不要再一直找你改 code, 而且發訊息的方式還要能一直新增, 但要求主程式都不要再改, 你怎麼寫?

由於不能改 code, 所以你並不能在程式裡利用 switch 來決定用哪一個 class , 對吧 !! (因為未來要加什麼 class ,現在並不知道)

問 : 不能改code,難倒我了

答: 你需要寫成


你可以將 myMail, myMobile 都實作 Isender 介面, 而 GetSender() 會去 config 檔讀設定, 決定要 load 哪一支 class, 日後若要加新方式,你要做的, 是開一個新專案, 寫好一支 class, 實作 Isender, 並編譯成 dll, 放入bin folder裡, 最後,去改 config 檔的內容, 如此一來, 主程式就不必改了

當然啦, GetSender() 在 config 裡讀到 "myMail" 字串, 要如何弄成 object 並傳回, 是你需要再 google 一下的。

GetSender()只是一支method, 它去讀 config 後決定要傳回什麼物件, 但這物件,一定有實作 Isender interface



 

後話:

上述的例子, 您可以想像若您要寫一個會員功能,用在你討論板程式裡, 然後賣給很多客戶, 但事實上每個客戶需要的會員機制並不相同, 如果你將會員機制寫在討論板程式裡, 那麼日後每當要賣出程式, 你勢必都要改程式碼, 但如果您先定義一個 會員的的interface , 那麼日後你每賣出討論板程式時, 主程式都不必改, 只需要加寫一支客戶要的會員機制, 實作您會員的interface, 就好了。如此一來, 您的討論板主程式只需要保留一份, 日後要修改功能都會變得很容易。

在 coding 時, 最好盡量針對父類別或介面來寫程式, 日後若要抽換邏輯,就比較不會被綁死。

這篇文章的相關討論: http://www.dotblogs.com.tw/william0657/archive/2008/09/17/5410.aspx

 


Copyright © AllenKuo.com , 2000 - 2010