接口 (Visual Basic)

接口 定义类可以实现的属性、方法和事件。 接口允许将功能定义为一小组密切相关的属性、方法和事件;这减少了兼容性问题,因为你可以为接口开发增强的实现,而不会危及现有代码。 你可以随时通过开发其他接口和实现来添加新功能。

你可能希望使用接口而不是类继承的几个其他原因:

  • 接口更适合应用程序需要许多可能不相关的对象类型来提供某些功能的情况。

  • 接口比基类更灵活,因为可以定义可实现多个接口的单个实现。

  • 在不需要从基类继承实现的情况下,接口更好。

  • 当无法使用类继承时,接口非常有用。 例如,结构不能继承自类,但它们可以实现接口。

声明接口

接口定义包含在InterfaceEnd Interface语句中。 在 Interface 语句之后,可以添加列出一个或多个继承接口的可选 Inherits 语句。 语句 Inherits 必须位于声明中的所有其他语句之前,注释除外。 接口定义中的剩余语句应为Event、、SubFunctionPropertyInterfaceClass、、和StructureEnum语句。 接口不能包含与实现代码关联的任何实现代码或语句,例如 End SubEnd Property

在命名空间中,接口语句默认为 Friend ,但它们也可以显式声明为 PublicFriend。 类、模块、接口和结构中定义的接口默认为Public,但它们也可以显式声明为PublicFriendProtectedPrivate

注释

Shadows 关键字可应用于所有接口成员。 Overloads关键字可以应用于SubFunctionProperty语句,这些语句是在接口定义中声明的。 此外,Property语句可以具有DefaultReadOnlyWriteOnly修饰符。 其他修饰符(Public、、PrivateFriendProtectedSharedOverridesMustOverrideOverridable)均不允许。 有关详细信息,请参阅 声明上下文和默认访问级别

例如,以下代码定义一个具有一个函数、一个属性和一个事件的接口。

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

实现接口

Visual Basic 保留字 Implements 有两种使用方法。 该 Implements 语句表示类或结构实现接口。 关键字 Implements 表示类成员或结构成员实现特定接口成员。

Implements 语句

如果一个类或结构实现了一个或多个接口,则必须在ImplementsClass语句之后立即包含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

实现成员的参数类型和返回类型必须与接口中的接口属性或成员声明匹配。 实现接口元素的最常见方法是具有与接口同名的成员,如前面的示例所示。

若要声明接口方法的实现,可以使用实例方法声明中合法的任何属性,包括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

可以使用私有成员来实现接口成员。 在私有成员实现一个接口成员时,即使在类的对象变量上不能直接使用该成员,仍然可以通过接口将其变为可用成员。

接口实现示例

实现接口的类必须实现其所有属性、方法和事件。

以下示例定义两个接口。 第二个接口继承Interface2Interface1并定义其他属性和方法。

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 中变体泛型接口的列表。