飛天南門

毛毛的異想世界

  點部落 :: Home :: Syndication :: 我的收藏 ::  :: Login
  文章數 - 7, 回應數 - 12, 引用數 - 0

每月文章

文章分類

好站連結

工具網站

技術論壇網站

 

小弟今天看到 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


posted on 2008/9/17 21:32 | 我要推薦 | 閱讀數 : 1155 | 文章分類 [ VB.NET ] 訂閱

Feedback

# re: 動態載入類別 2008/9/18 上午 08:28 topcat 回覆

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

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

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

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

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

 



# re: 動態載入類別 2008/9/18 上午 10:08 allenkuo 回覆

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

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

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

 



# re: 動態載入類別 2008/9/18 下午 07:31 william0657 回覆

感謝兩位大大回應

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

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

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



# re: 動態載入類別 2008/9/19 下午 10:26 chhuang 回覆

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

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

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

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



# re: 動態載入類別 2008/9/20 上午 02:05 william0657 回覆

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



# re: 動態載入類別 2008/9/22 上午 09:27 allenkuo 回覆

to william,

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



# re: 動態載入類別 2008/9/24 下午 05:08 allenkuo 回覆

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    

每一支都是如此



# re: 動態載入類別 2008/9/24 下午 08:02 william0657 回覆

TO Allenkuo:
已修正了,謝謝。



回應

標題:
姓名:
電子郵件:(將不會被顯示)
個人網頁:
內容: 

登入後使用進階評論
Please add 1 and 6 and type the answer here: