介面 (Visual Basic)

「介面」可定義類別可實作的屬性、方法和事件。 介面可讓您將功能定義為一小組緊密相關的屬性、方法和事件;這會降低相容性問題,因為您可以為您的介面開發增強的實作,而不會危及現有程式碼。 只要開發額外的介面和實作,您就可以隨時加入新功能。

另有幾個原因,會讓您想要使用介面而非類別繼承:

  • 介面是較適用於,當您的應用程式需要許多可能不相關的物件類型來提供特定功能時。

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

  • 介面較適合不必從基底類別繼承實作的情況。

  • 當您無法使用類別繼承時,介面相當有用。 例如,結構不能從類別繼承,但它們可以實作介面。

宣告介面

介面定義內含於 InterfaceEnd Interface 陳述式之間。 遵循 Interface 陳述式,您可以新增選擇性的 Inherits 陳述式,其中列出一或多個繼承的介面。 Inherits 陳述式必須在宣告中所有其他陳述式之前 (註解除外)。 介面定義中剩餘的陳述式應該是 EventSubFunctionPropertyInterfaceClassStructureEnum 陳述式。 介面不能包含任何實作程式碼,或實作程式碼相關聯的陳述式,例如 End SubEnd Property

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

注意

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

例如,下列程式碼會定義一個介面,其包含一個函式、一個屬性與一個事件。

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

實作介面

Visual Basic 保留字 Implements 有兩種用途。 Implements 陳述式表示類別或結構實作介面。 Implements 關鍵字表示類別成員或結構成員實作特定介面成員。

Implements 陳述式

如果類別或結構實作一或多個介面,它在 ClassStructure 陳述式後面必須緊接著 Implements 陳述式。 Implements 陳述式需要由類別實作的介面清單 (以逗號分隔)。 類別或結構必須使用 Implements 關鍵字實作所有介面成員。

Implements 關鍵字

Implements 關鍵字需要實作介面成員之逗號分隔清單。 一般而言,只會指定單一介面成員,但您可以指定多個成員。 介面成員的規格包含介面名稱 (必須在類別內的實作陳述式中指定)、句號,以及要實作的成員函式、屬性或事件的名稱。 實作介面成員的成員名稱可使用任何合法識別碼,且不受限於舊版 Visual Basic 中使用的 InterfaceName_MethodName 慣例 。

例如,下列程式碼顯示如何宣告實作介面的方法、且名為 Sub1 的副程式:

Class Class1
    Implements interfaceclass.interface2

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

實作成員的參數類型和傳回型別,必須符合介面中的介面屬性或成員宣告。 最常見的實作介面項目的方式是使用與介面同名的成員,如上述範例所示。

若要宣告介面方法的實作,您可以使用執行個體方法宣告上的任何合法屬性,包括 OverloadsOverridesOverridablePublicPrivateProtectedFriendProtected FriendMustOverrideDefaultStaticShared 屬性無效,因為它會定義類別而非執行個體方法。

使用 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 屬性 (也就是您不需要在實作類別中將它宣告為 readonly)。 實作介面保證至少會實作此介面所宣告的成員,但是您可以提供更多功能,例如可讓您使用可寫入的屬性。

標題 描述
逐步解說:建立及實作介面 提供詳細的程序,引導您定義和實作您自己的介面之程序。
泛型介面中的變異數 討論泛型介面中的共變性與逆變性,並提供.NET Framework 中的 Variant 泛型介面清單。