Get Microsoft Silverlight

最新回應

動態載入類別

 

小弟今天看到 Allen大大寫的一篇文章

換個方式來講 interface / OO

www.allenkuo.com/GenericArticle/view437.aspx

前面我還寫的出來,只是後面動態的還真的沒有實做過,我通常都是先轉型再使用

想說有空就來寫寫看,以下是我實做的過程,如果有錯請大大們指導,謝謝:

首先寫簡單類別:

 

 

 

''' <summary> 
''' 介面 
''' </summary> 
''' <remarks></remarks> 
Public Interface ISend 
    Function  Send(ByVal memberID As String, ByVal message As String) As String 
 
End Interface 
''' <summary> 
''' 實做ISend介面 
''' </summary> 
''' <remarks>手機簡訊類別</remarks> 
Public Class clsMobile 
    Implements clsSend.ISend 
 
 
    Public  Function Send(ByVal memberID As String, ByVal message As String) As String Implements ISend.Send 
        Dim recStr As String = "" 
        recStr = String.Format("這是手機傳簡訊的類別:帳號 {0}  訊息內容 {1}", memberID, message) 
        Return recStr 
    End Function 
End Class 
 
''' <summary> 
''' 實做ISend介面 
''' </summary> 
''' <remarks>Mail類別</remarks> 
Public Class clsMail 
    Implements clsSend.ISend 
 
    Public  Function Send(ByVal memberID As String, ByVal message As String) As String Implements ISend.Send 
        Dim recStr As String = "" 
        recStr = String.Format("這是電子郵件類別:帳號 {0}  郵件內容 {1}", memberID, message) 
        Return recStr 
    End Function 
End Class

 

 

App.config 增加以下設定(預設為手機簡訊):

<appSettings> 
  <add key="objSend" value="clsSend"/> 
  <add key="clsSend" value="clsSend.clsMobile"/> 
  <!--郵寄類別 add key="clsSend" value="clsSend.clsMobile"/--> 
    </appSettings>

 

寫一個簡單winForm,放兩個textbox 一個為 使用者ID 一個為 傳送訊息內容

 

程式碼如下:

Imports clsSend 
Imports System.Reflection 
Public Class Form 
    ''' <summary> 
    ''' 讀取Config的設定決定要傳那一個類別 
    ''' </summary> 
    ''' <returns></returns> 
    ''' <remarks></remarks> 
    Shared Function getSendObj() As ISend 
        Dim a As Assembly 
        Dim SendType As Type 
        Dim obj As Object 
        Try 
            '讀取組件的名稱 
            a = Assembly.Load(System.Configuration.ConfigurationManager.AppSettings.Item("objSend")) 
            '取得類別的名稱,預設為手機,如果要改成Mail直接改app.config的設定 
            SendType = a.GetType(System.Configuration.ConfigurationManager.AppSettings.Item("clsSend")) 
            obj = Activator.CreateInstance(SendType) 
            Return obj 
        Catch ex As Exception 
            MsgBox("應用程式讀取錯誤,請通知資訊人員。") 
            End 
        End Try 
 
 
    End Function 
 
 
    Private Sub btnSend_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSend.Click 
        Dim obj As ISend 
        obj = getSendObj() 
        MsgBox(obj.Send(Me.txtMemberID.Text, Me.txtMsg.Text)) 
    End Sub 
End Class

 

參考:msdn.microsoft.com/zh-tw/library/system.activator.aspx

分享


回應

  • topcat 2008/9/18 上午 08:28 回覆

    # re: 動態載入類別

    OO小喵也還在學習
    小喵的一些小小看法大家也提供大家一起研究

    您把判斷的部分寫在Form裡面,程式運作當然沒問題,不過,如果哪天又多了另外一種傳送的方式,那麼您是否還必須再改一次Form的程式碼呢??如果有三個Form要用相同的方式,是否要改三個Form的程式碼呢??

    或許可以這樣(不知道對或不對):額外再寫一個公用的類別,這個類別一樣使用相同的介面,一樣有Send的函數,然後在這個類別中,去判斷Config中目前設定的方法是什麼,此時才去判斷,動態的使用不同的類別來執行運作Send

    然後把Form裡面的程式碼改為使用這個【公用類別】,這樣未來不論有幾個Form用這個功能時,都是一樣的呼叫【公用類別】。這樣一來,未來要擴充別的方式,只要在公用類別中加入判斷,然後再Config中更改設定,Form裡面的程式碼都可以不用變更。

    以上是小喵的小小看法,與大家分享討論

     

  • allenkuo 2008/9/18 上午 10:08 回覆

    # re: 動態載入類別

    不好意思,我的文章遲遲沒加入討論功能, 變成要在別處討論, 您寫的就大致算對了

    至於我的實務經驗, 由於要發出訊息的方式/內容/名單,都放在db裡,再用迴圈去慢慢送, 因此是將型別載入後就先存著,免得每一筆都要載入,那會太慢

    如topcat所說,您額外加入一個dll project,裡面寫getSendObj(), 簡而言之,就是用simple factory(簡單工廠)啦

     

  • william0657 2008/9/18 下午 07:31 回覆

    # re: 動態載入類別

    感謝兩位大大回應

    我原本 getSendObj那個函式,就是要寫一個專門處理的類別函式,應該說是自已懶惰,所以先用 Shared 的方法,沒想到被兩位大大發現了 ^_^

    至於Allen大大提的 simple factory(簡單工廠) ,可能小弟對OO不是很清楚,有空再去研究一下,而且小弟目前待的公司用 .NET開發的專案不是純OO的寫法,都是BY 專案去寫,隨自已高興,可是說也奇怪我還沒進這家公司之前,反而用 VB6.0寫的專案到是很徹底的OO

    而且公司目前的規劃也沒打算要用OO,一切都是我『自得其樂』。

  • chhuang 2008/9/19 下午 10:26 回覆

    # re: 動態載入類別

    我私心認為 Send 是建立 Strategy 模型...

    定義一個 SendBehavior 介面定義 Send 方法,然後由 SendByMobile 與 SendByMail 來繼承之,由以上子項類別實作 Send 方法。

    而想要擁有 Send 方法的 X 類別,則是定義 SendBehavior 屬性,由 X 的建構子決定預設是 SendByMobile 或 SendByMail 的 Send。

    http://www.dofactory.com/Patterns/PatternStrategy.aspx

  • william0657 2008/9/20 上午 02:05 回覆

    # re: 動態載入類別

    謝謝,小弟受教了,以這樣的設計方式必須要有一個很強 的Leader去做分析,若剛開始的方向走錯了到最後會是一個很慘痛的經驗,拉回到實際面,現在很少有公司願意花這麼多的時間跟金錢做分析,只希望能快點結案跟客戶收錢最好,要不然現在的公司『說倒就倒』。

  • allenkuo 2008/9/22 上午 09:27 回覆

    # re: 動態載入類別

    to william,

    或許是您不熟,才會覺得這需要事先很強的人去做分析, 其實您平時寫小案子時, 就可以試著用OO的方式來寫, 等遇到較複雜的案子時,就比較容易了

  • allenkuo 2008/9/24 下午 05:08 回覆

    # re: 動態載入類別

    to william,

    您程式碼中, 有些寫錯了,例如

    Public Function Send() Function Send(ByVal memberID As StringByVal message As StringAs String Implements ISend.Send    

    要改成

    Public Function Send(ByVal memberID As StringByVal message As StringAs String Implements ISend.Send    

    每一支都是如此

  • william0657 2008/9/24 下午 08:02 回覆

    # re: 動態載入類別

    TO Allenkuo:
    已修正了,謝謝。

標題 *

名稱 *

Email 

Url  

回應 *

登入後使用進階評論

Please add 7 and 1 and type the answer here: