介面 會定義類別可以實作的屬性、方法和事件。 介面可讓您將功能定義為一小群密切相關的屬性、方法和事件;這可減少相容性問題,因為您可以開發介面的增強實作,而不會危及現有的程序代碼。 您隨時都可以藉由開發其他介面和實作來新增功能。
您可能想要使用介面而非類別繼承的幾個其他原因:
介面更適合您的應用程式需要許多可能不相關的物件類型來提供特定功能的情況。
介面比基類更有彈性,因為您可以定義可實作多個介面的單一實作。
在不需要從基類繼承實作的情況下,介面會更好。
當您無法使用類別繼承時,介面會很有用。 例如,結構無法繼承自類別,但可以實作介面。
宣告介面
介面定義會包住在 Interface
和 End Interface
語句內。 在 Interface
語句之後,您可以添加一個可選的 Inherits
語句,以列出一個或多個繼承的介面。 語句 Inherits
必須位於宣告中除批注以外的所有其他語句之前。 介面定義中的其餘語句應該是 Event
、Sub
、Function
、、Property
、、Interface
、Class
Structure
和 Enum
語句。 介面不能包含任何與實作程式代碼相關聯的實作程式代碼或語句,例如 End Sub
或 End Property
。
在命名空間中,介面語句預設為 Friend
,但也可以明確宣告為 Public
或 Friend
。 類別、模組、介面和結構內定義的介面預設為 Public
,但它們也可以明確宣告為 Public
、、 Friend
Protected
或 Private
。
備註
Shadows
關鍵詞可以套用至所有介面成員。
Overloads
關鍵詞可以套用在介面定義中所宣告的 Sub
、Function
和 Property
語句。 此外, Property
語句可以有 Default
、 ReadOnly
或 WriteOnly
修飾詞。 不允許其他修飾詞Public
、、Private
、、Friend
Protected
、Shared
、Overrides
、 MustOverride
或 Overridable
。 如需詳細資訊,請參閱 宣告內容和預設存取層級。
例如,下列程式代碼會定義具有一個函式、一個屬性和一個事件的介面。
Interface IAsset
Event ComittedChange(ByVal Success As Boolean)
Property Division() As String
Function GetID() As Integer
End Interface
實作介面
Visual Basic 保留字 Implements
會以兩種方式使用。 語句 Implements
表示類別或結構會實作 介面。
Implements
關鍵詞表示類別成員或結構成員實作特定的介面成員。
實現語句
如果類別或結構實作一或多個介面,則必須在Implements
或Class
語句之後立即包含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
實作成員的參數類型和傳回型別必須符合介面中的介面屬性或成員宣告。 實作介面元素的最常見方式是具有與 介面同名的成員,如上一個範例所示。
若要宣告介面方法的實作,您可以使用實例方法宣告中合法的任何屬性,包括 Overloads
、Overrides
、Overridable
、Public
、Private
、Protected
、Friend
、Protected Friend
、MustOverride
、Default
和 Static
。 屬性 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 中的變體泛型介面清單。 |