共用方式為


介面 (Visual Basic)

介面 會定義類別可以實作的屬性、方法和事件。 介面可讓您將功能定義為一小群密切相關的屬性、方法和事件;這可減少相容性問題,因為您可以開發介面的增強實作,而不會危及現有的程序代碼。 您隨時都可以藉由開發其他介面和實作來新增功能。

您可能想要使用介面而非類別繼承的幾個其他原因:

  • 介面更適合您的應用程式需要許多可能不相關的物件類型來提供特定功能的情況。

  • 介面比基類更有彈性,因為您可以定義可實作多個介面的單一實作。

  • 在不需要從基類繼承實作的情況下,介面會更好。

  • 當您無法使用類別繼承時,介面會很有用。 例如,結構無法繼承自類別,但可以實作介面。

宣告介面

介面定義會包住在 InterfaceEnd Interface 語句內。 在 Interface 語句之後,您可以添加一個可選的 Inherits 語句,以列出一個或多個繼承的介面。 語句 Inherits 必須位於宣告中除批注以外的所有其他語句之前。 介面定義中的其餘語句應該是 EventSubFunction、、Property、、InterfaceClassStructureEnum 語句。 介面不能包含任何與實作程式代碼相關聯的實作程式代碼或語句,例如 End SubEnd Property

在命名空間中,介面語句預設為 Friend ,但也可以明確宣告為 PublicFriend。 類別、模組、介面和結構內定義的介面預設為 Public ,但它們也可以明確宣告為 Public、、 FriendProtectedPrivate

備註

Shadows關鍵詞可以套用至所有介面成員。 Overloads 關鍵詞可以套用在介面定義中所宣告的 SubFunctionProperty 語句。 此外, Property 語句可以有 DefaultReadOnlyWriteOnly 修飾詞。 不允許其他修飾詞Public、、Private、、FriendProtectedSharedOverridesMustOverrideOverridable。 如需詳細資訊,請參閱 宣告內容和預設存取層級

例如,下列程式代碼會定義具有一個函式、一個屬性和一個事件的介面。

Interface IAsset
    Event ComittedChange(ByVal Success As Boolean)
    Property Division() As String
    Function GetID() As Integer
End Interface

實作介面

Visual Basic 保留字 Implements 會以兩種方式使用。 語句 Implements 表示類別或結構會實作 介面。 Implements關鍵詞表示類別成員或結構成員實作特定的介面成員。

實現語句

如果類別或結構實作一或多個介面,則必須在ImplementsClass語句之後立即包含Structure語句。 語句 Implements 需要一個以逗號分隔的介面清單,這些介面須由類別來實作。 類別或結構必須使用 Implements 關鍵字來實作所有介面成員。

實作關鍵詞

關鍵詞 Implements 需要實作介面成員的逗號分隔清單。 一般而言,只指定單一介面成員,但您可以指定多個成員。 介面成員的規格是由介面名稱所組成,該名稱必須在 類別內的 implements 語句中指定;句點;和要實作的成員函式、屬性或事件名稱。 實作介面成員的成員名稱可以使用任何法律標識符,而且不限於 InterfaceName_MethodName 舊版Visual Basic中使用的慣例。

例如,下列程式代碼示範如何宣告名為 Sub1 的子程式,以實作 介面的方法:

Class Class1
    Implements interfaceclass.interface2

    Sub Sub1(ByVal i As Integer) Implements interfaceclass.interface2.Sub1
    End Sub
End Class

實作成員的參數類型和傳回型別必須符合介面中的介面屬性或成員宣告。 實作介面元素的最常見方式是具有與 介面同名的成員,如上一個範例所示。

若要宣告介面方法的實作,您可以使用實例方法宣告中合法的任何屬性,包括 OverloadsOverridesOverridablePublicPrivateProtectedFriendProtected FriendMustOverrideDefaultStatic。 屬性 Shared 不合法,因為它會定義類別,而不是實例方法。

使用 Implements,您也可以撰寫單一方法,以實作介面中定義的多個方法,如下列範例所示:

Class Class2
    Implements I1, I2

    Protected Sub M1() Implements I1.M1, I1.M2, I2.M3, I2.M4
    End Sub
End Class

您可以使用私人成員來實作介面成員。 當一個私有成員實作了一個介面的成員時,該成員即使不能直接在類別的實例變數上使用,也能通過該介面變成可用。

介面實作範例

實作介面的類別必須實作其所有屬性、方法和事件。

下列範例會定義兩個介面。 第二個介面 會 Interface2繼承 Interface1 並定義額外的屬性和方法。

Interface Interface1
    Sub sub1(ByVal i As Integer)
End Interface

' Demonstrates interface inheritance.
Interface Interface2
    Inherits Interface1
    Sub M1(ByVal y As Integer)
    ReadOnly Property Num() As Integer
End Interface

下一個範例會實作 Interface1上一個範例中定義的介面:

Public Class ImplementationClass1
    Implements Interface1
    Sub Sub1(ByVal i As Integer) Implements Interface1.sub1
        ' Insert code here to implement this method.
    End Sub
End Class

最後一個範例會實作 Interface2,包括繼承自 Interface1的方法:

Public Class ImplementationClass2
    Implements Interface2
    Dim INum As Integer = 0
    Sub sub1(ByVal i As Integer) Implements Interface2.sub1
        ' Insert code here that implements this method.
    End Sub
    Sub M1(ByVal x As Integer) Implements Interface2.M1
        ' Insert code here to implement this method.
    End Sub

    ReadOnly Property Num() As Integer Implements Interface2.Num
        Get
            Num = INum
        End Get
    End Property
End Class

您可以使用 readwrite 屬性來實作 readonly 屬性(也就是說,您不需要在實作類別中以唯讀方式宣告它)。 實作介面承諾至少實作介面宣告的成員,但您可以提供更多功能,例如允許可寫入屬性。

標題 說明
逐步解說:建立和實作介面 提供詳細的過程,引導您完成定義和實作您自己的介面。
泛型介面中的變異數 討論泛型介面中的共變數和反變數,並提供 .NET Framework 中的變體泛型介面清單。