免費論壇 繁體 | 簡體
Sclub交友聊天~加入聊天室當版主
分享
返回列表 回復 發帖

抽象類別(介面)

http://www.vbgood.com/article-3741.html
繼承類別
接下來將構建要繼承的 Line 類。鍵入如下所示的代碼。
Public Class Line
    Private mstrLine As String   
    Property Line() As String
        Get
            Return mstrLine
        End Get
        Set(ByVal Value As String)
            mstrLine = Value
        End Set
    End Property
   
    ReadOnly Property Length() As Integer
        Get
            Return mstrLine.Length
        End Get
    End Property
   
    Public Function GetWord() As String
        Dim astrWords() As String        
        astrWords = mstrLine.Split(" ".ToCharArray())        
        Return astrWords(0)
    End Function
End Class

創建子類
既然表單和基類都已經創建完畢,現在便可以開始執行繼承了。
按一下 Project(專案),然後按一下 Add Class(添加類)。將該類命名為 LineDelim.vb 並按一下 OK(確定)。
添加新類時,請修改 Visual Basic .NET 所創建的代碼,使之與下面的示例代碼相似。
Public Class LineDelim
    Inherits Line
End Class
因為添加了 Inherits Line 語句,所以您可以在這一新創建的類中使用 Line 類的所有屬性和方法。添加以下代碼:
Protected Sub btnFirst_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles btnFirst.Click
    Dim oLine As LineDelim = New LineDelim()      
    oLine.Line = txtLine.Text
    txtFirstWord.Text = oLine.GetWord()
End Sub
運行專案,並在表單上按一下 Get Word(取詞)按鈕。您將看到“The”一字出現在按鈕旁邊的唯讀文字方塊中。

Inherits 語句的功能非常強大,只需要使用這一個語句,就可以在 LineDelim 類中使用 Line 類的所有屬性和方法。儘管這個新類尚未執行任何新的操作,但它卻表明從 Line 類中繼承的所有代碼都可以正常工作。
添加其他功能

現在,您可以使用其他屬性和方法對 LineDelim 類進行擴展。要向 LineDelim 類添加兩個新的屬性,請執行以下步驟。
在上一部分添加的 Inherits 語句後添加兩個 Private 變數,如下所示。
Private mstrDelim As String = " "
Private mstrOriginal As String
鍵入如下代碼,為這兩個 Private 變數添加適當的 Property 語句。您可以將以下代碼放在上面輸入的兩行代碼後面。
Public Property Delimiter() As String
    Get
        Return mstrDelim
    End Get
    Set(ByVal Value As String)
        mstrDelim = Value
    End Set
End Property
   
Public ReadOnly Property OriginalLine() As String
    Get
        Return mstrOriginal
    End Get
End Property
現在您可以使用 Delimiter 屬性設置並獲取 Private 變數 mstrDelim 的值。
如果不希望其他人更改這些屬性,您可以將屬性設為唯讀。要執行此操作,請不再使用 Set 語句,並在 Property 語句中添加 ReadOnly 屬性。有關示例,請參見上面代碼中顯示的 OriginalLine 屬性聲明。
接下來,需要創建一個稱為 ReplaceAll 的方法,此方法可以將文本行中的所有空格替換為傳遞到 Delimiter 屬性中的分隔符號字元。
Public Function ReplaceAll() As String
    mstrOriginal = MyBase.Line      
    Return MyBase.Line.Replace(" ", mstrDelim.ToChar())
End Function
ReplaceAll 方法通過基類的 Line 方法檢索原始文本行。而以前從基類中檢索屬性時使用的是 MyBase.Line 語法。ReplaceAll 函數將 MyBase.Line 屬性的值放入您剛剛為該類創建的 Private 變數 mstrOriginal 中。String 資料類型的 Replace 方法將字串字元的所有實例替換為在 Delimiter 屬性中設置的新分隔符號字元 mstrDelim。

MyBase 關鍵字
可以從任一子類使用 MyBase 關鍵字,以調用基類中的任何屬性或方法。即使基類的方法在子類中已被覆蓋,您也可以使用該關鍵字對其進行調用。例如,如果在基類中存在 ReplaceAll 方法,但在子類中該方法已被覆蓋,您可以從子類的 ReplaceAll 方法中調用基類的 ReplaceAll 方法。
試一試打開 frmLineTest.vb 表單。按兩下 Replace(替換)以調出按一下事件程序。
在 btnReplace 按鈕的按一下事件中編寫以下代碼:
Protected Sub btnReplace_Click( ByVal sender As Object, ByVal e As System.EventArgs) Handles btnReplace.Click
    Dim oLine As LineDelim = New LineDelim()      
    oLine.Delimiter = txtDelim.Text
    oLine.Line = txtLine.Text
    txtReplace.Text = oLine.ReplaceAll()
End Sub

此代碼將 Delimiter 屬性設置為在示例表單的 txtDelimiter 文字方塊中輸入的值。然後您可以調用 ReplaceAll 方法,將文本行中的所有空格更改為新的分隔符號字元。按 F5 鍵運行該項目。
按一下 Replace(替換)。您將看到,在此按鈕旁邊的文字方塊中,句中的每個詞之間都有一個逗號。

覆蓋方法
添加 Delimiter 屬性後,您可能想更改 LineDelim 類中的 GetWord 方法,以便使用相應的分隔符號替代 Line 類使用的單個空格。因為您不一定想更改基類,所以需要覆蓋 LineDelim 類中 GetWord 方法的功能。在 LineDelim 類中創建新的 GetWord 方法之前,您需要在 Line 類的 GetWord 方法聲明中添加一個關鍵字。
在 Solution Explorer(解決方案資源管理器)視窗中,打開 Line.vb 類的代碼視窗。找到 GetWord 方法的聲明,如下所示:
Public Overloads Function GetWord() As String
在函式宣告中添加關鍵字 Overridable,如下所示(沒有此關鍵字,就無法覆蓋此方法)。
Public Overridable Overloads Function GetWord() As String
打開 LineDelim.vb 類,並使用如下代碼添加新的 GetWord 方法。
Public Overloads Overrides Function GetWord() As String
    Dim astrWords() As String      
    astrWords = MyBase.Line.Split(mstrDelim.ToCharArray())      
    Return astrWords(0)
End Function
如果要更改基類中方法的功能,則有必要在函式宣告中添加 Overrides 關鍵字。現在,LineDelim 類中的 GetWord 方法就可以使用 Delimiter 屬性的值來分隔句中的詞。
如果只覆蓋其中一個 GetWord 方法,則代碼只能查看這一個版本的方法,而無法調用其他版本的 GetWord 方法。要顯示所有方法,您必須覆蓋每一個方法,就象您在 LineDelim 類中所執行的操作一樣。

抽象類別
使用抽象類別的原因有多種。對於強制子類設計人員實現應用程式通常所需的所有介面,抽象類別非常有用。您可以在不破壞用戶端應用程式的情況下向子類添加新方法,這是使用介面所無法實現的;可以在基類中提供許多默認實現方法,從而減少子類需要完成的工作量。
介面繼承
創建抽象類別時,請使用關鍵字 Interface 而不是 Class。為介面命名,然後定義需要子類實現的所有屬性和方法。這是因為基類中沒有可以實現的屬性和方法,它只包含一般資料,而不包含方法。您所創建的只是一個合約,它規定所有使用此介面的子類都必須遵循一定的規則。
現在,請在已創建的項目中添加一個新類。
從 Visual Studio 功能表中,按一下 Project(專案),然後按一下 Add Class(添加類)。
在類中添加以下代碼:
Interface Person
    Property FirstName() As String
    Property LastName() As String   
    Sub Print()
    Sub Talk()
End Interface

您會發現,您定義屬性和子過程的方法與您通常定義這些屬性和過程的方法一樣。唯一的差別在於,您沒有為它們編寫任何代碼。現在來看看如何在類定義中使用此介面。
在上一步驟創建的類檔中添加以下代碼:
Public Class Employee
    Implements Person
   
    Private mstrFirstName As String
    Private mstrLastName As String
   
    Property FirstName() As String _
     Implements Person.FirstName
        Get
            Return mstrFirstName
        End Get
        Set
            mstrFirstName = Value
        End Set
    End Property
   
    Property LastName() As String _
     Implements Person.LastName
        Get
            Return mstrLastName
        End Get
        Set
            mstrLastName = Value
        End Set
    End Property
   
    Sub Print() Implements Person.Print
        注釋: 在此處添加一些代碼        
    End Sub

    Sub Talk() Implements Person.Talk
        注釋: 在此處添加一些代碼
    End Sub
End Class

在 Employee 類定義之後的第一行是 Implements Person。此關鍵字表示您要遵守 Person 介面中定義的合約。現在您可以定義該合約中的所有屬性和方法。在每一個 Property 語句後面,都必須包含 Implements 關鍵字,並且必須指定介面的名稱和您正在使用的方法/屬性的名稱(兩個名稱之間有一個點 [.])。Visual Basic .NET 將跟蹤每一個介面,在所有介面創建完畢之前,您不能編譯應用程式。
如果要運行代碼,則需要創建相應的子過程,因為在上面的示例中這些子過程被保留為空。創建所有子過程後,您就可以與您通常創建並使用任何其他物件一樣,聲明並使用新的 Employee 物件了。
返回列表