接口 定义类可以实现的属性、方法和事件。 接口允许将功能定义为一小组密切相关的属性、方法和事件;这减少了兼容性问题,因为你可以为接口开发增强的实现,而不会危及现有代码。 你可以随时通过开发其他接口和实现来添加新功能。
你可能希望使用接口而不是类继承的几个其他原因:
接口更适合应用程序需要许多可能不相关的对象类型来提供某些功能的情况。
接口比基类更灵活,因为可以定义可实现多个接口的单个实现。
在不需要从基类继承实现的情况下,接口更好。
当无法使用类继承时,接口非常有用。 例如,结构不能继承自类,但它们可以实现接口。
声明接口
接口定义包含在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 语句
如果一个类或结构实现了一个或多个接口,则必须在Implements
或Class
语句之后立即包含Structure
语句。
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
实现成员的参数类型和返回类型必须与接口中的接口属性或成员声明匹配。 实现接口元素的最常见方法是具有与接口同名的成员,如前面的示例所示。
若要声明接口方法的实现,可以使用实例方法声明中合法的任何属性,包括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
可以通过使用一个可读写的属性来实现一个只读属性(也就是说,不必在实现类中将其声明为只读属性)。 实现接口意味着必须至少实现接口所声明的成员,但你可以提供更多功能,例如让你的属性可写。
相关主题
标题 | DESCRIPTION |
---|---|
演练:创建和实现接口 | 提供一个详细的过程,引导你完成定义和实现自己的接口的过程。 |
泛型接口中的方差 | 讨论泛型接口中的协变和逆变,并提供 .NET Framework 中变体泛型接口的列表。 |