Interface 语句 (Visual Basic)

声明接口的名称,并介绍接口包含的成员的定义。

语法

[ <attributelist> ] [ accessmodifier ] [ Shadows ] _  
Interface name [ ( Of typelist ) ]  
    [ Inherits interfacenames ]  
    [ [ modifiers ] Property membername ]  
    [ [ modifiers ] Function membername ]  
    [ [ modifiers ] Sub membername ]  
    [ [ modifiers ] Event membername ]  
    [ [ modifiers ] Interface membername ]  
    [ [ modifiers ] Class membername ]  
    [ [ modifiers ] Structure membername ]  
End Interface  

组成部分

术语 定义
attributelist 可选。 请参阅特性列表
accessmodifier 可选。 可以是以下值之一:

- Public
- Protected
- Friend
- 专用
- Protected Friend
- Private Protected

请参阅 Access levels in Visual Basic
Shadows 可选。 请参阅 Shadows
name 必需。 此接口的名称。 请参阅 Declared Element Names
Of 可选。 指定这是一个泛型接口。
typelist 如果使用 Of 关键字,则为必需。 此接口的类型参数列表。 可以选择使用 InOut 泛型修饰符声明每个类型参数的变体。 请参阅类型列表
Inherits 可选。 指示此接口继承另一个或多个接口的属性和成员。 请参阅 Inherits 语句
interfacenames 如果使用 Inherits 语句,则为必需。 派生此接口的接口名称。
modifiers 可选。 要定义的接口成员的适当修饰符。
Property 可选。 定义一个属性,该属性是接口的成员。
Function 可选。 定义 Function 过程,该过程是接口的成员。
Sub 可选。 定义 Sub 过程,该过程是接口的成员。
Event 可选。 定义一个事件,该事件是接口的成员。
Interface 可选。 定义一个嵌套在此接口内的接口。 嵌套接口定义必须以 End Interface 语句终止。
Class 可选。 定义一个类,该类是接口的成员。 成员类定义必须以 End Class 语句终止。
Structure 可选。 定义一个结构,该结构是接口的成员。 成员结构定义必须以 End Structure 语句终止。
membername 对于定义为接口成员的每个属性、过程、事件、接口、类或结构,是必需的。 成员名。
End Interface 终止 Interface 定义。

注解

接口定义类和结构可以实现的一组成员,例如属性和过程。 接口仅定义成员的签名,而不定义其内部工作原理。

类或结构通过为接口定义的每个成员提供代码来实现接口。 最后,当应用程序根据该类或结构创建实例时,存在相应对象,并且该对象在内存中运行。 有关详细信息,请参阅对象和类接口

只能在命名空间或模块级别使用 Interface。 这意味着接口的声明上下文必须是源文件、命名空间、类、结构、模块或接口,不能是过程或块。 有关详细信息,请参阅声明上下文和默认访问级别

接口默认具有 Friend 访问权限。 可以使用访问修饰符调整其访问级别。 有关详细信息,请参阅 Visual Basic 中的访问级别

规则

  • 嵌套接口。 可以在一个接口中定义另一个接口。 外部接口称为包含接口,内部接口称为嵌套接口。

  • 成员声明。 将属性或过程声明为接口成员时,只会定义该属性或过程的签名。 这包括元素类型(属性或过程)、其参数和参数类型以及返回类型。 因此,成员定义只使用一行代码,并且 End FunctionEnd Property 等终止语句在接口中无效。

    反过来,定义枚举或结构或者嵌套类或接口时,必须包含其数据成员。

  • 成员修饰符。 定义模块成员时不能使用任何访问修饰符,也不能指定 Shared 或除 Overloads 之外的任何过程修饰符。 可以使用 Shadows 声明任何成员,并且可以在定义属性时使用 Default 以及 ReadOnlyWriteOnly

  • 继承。 如果接口使用 Inherits 语句,则可以指定一个或多个基接口。 可以从两个接口继承,即使它们各自定义了具有相同名称的成员。 如果这样做,实现代码必须使用名称限定来指定其要实现的成员。

    一个接口不能从另一个具有更严格的访问级别的接口继承。 例如,Public 接口不能从 Friend 接口继承。

    一个接口不能从嵌套在其中的另一个接口继承。

  • 实现。 当某个类使用 Implements 语句来实现此接口时,它必须实现接口中定义的每个成员。 此外,实现代码中的每个签名都必须与此接口中定义的相应签名完全匹配。 但是,实现代码中的成员名称不必与接口中定义的成员名称匹配。

    当类实现过程时,它不能将过程指定为 Shared

  • 默认属性。 接口最多可以指定一个属性作为其默认属性,该属性无需使用属性名称即可引用。 可以通过使用 Default 修饰符声明此类属性来指定它。

    请注意,这意味着接口只有在没有继承时才能定义默认属性。

行为

  • 访问级别。 所有接口成员都隐含 Public 访问权限。 定义成员时不能使用任何访问修饰符。 但是,实现接口的类可以为每个实现的成员声明一个访问级别。

    如果将类实例分配给变量,则其成员的访问级别可能取决于变量的数据类型是底层接口还是实现类。 下面的示例对此进行了演示。

    Public Interface IDemo
        Sub DoSomething()
    End Interface
    Public Class implementIDemo
        Implements IDemo
        Private Sub DoSomething() Implements IDemo.DoSomething
        End Sub
    End Class
    Dim varAsInterface As IDemo = New implementIDemo()
    Dim varAsClass As implementIDemo = New implementIDemo()
    

    如果通过 varAsInterface 访问类成员,它们都具有 Public 访问权限。 但是,如果通过 varAsClass 访问成员,则 Sub 过程 doSomething 具有 Private 访问权限。

  • 作用域。 接口在其命名空间、类、结构或模块的范围内。

    各接口成员的范围为整个接口。

  • 生存期。 接口本身没有生存期,它的成员也没有。 当类实现接口并且创建对象作为该类的实例时,该对象在运行它的应用程序中具有生存期。 有关详细信息,请参阅 Class 语句中的“生存期”。

示例

以下示例使用 Interface 语句定义名为 thisInterface 的接口,必须使用 Property 语句和 Function 语句实现此接口。

Public Interface thisInterface
    Property ThisProp(ByVal thisStr As String) As Char
    Function ThisFunc(ByVal thisInt As Integer) As Integer
End Interface

请注意,PropertyFunction 语句不会在接口中引入以 End PropertyEnd Function 结尾的块。 接口仅定义其成员的签名。 完整的 PropertyFunction 块出现在实现 thisInterface 的类中。

另请参阅