Интерфейсы (Visual Basic)Interfaces (Visual Basic)

Интерфейсы определяют свойства, методы и события, которые можно реализовать в классах.Interfaces define the properties, methods, and events that classes can implement. Интерфейсы позволяют определить возможности в виде небольших групп тесно связанных свойств, методов и событий. Это снижает число проблем совместимости, так как можно создавать усовершенствованные реализации интерфейсов без изменения существующего кода.Interfaces allow you to define features as small groups of closely related properties, methods, and events; this reduces compatibility problems because you can develop enhanced implementations for your interfaces without jeopardizing existing code. Вы можете добавлять новые функции в любое время с помощью дополнительных интерфейсов и реализаций.You can add new features at any time by developing additional interfaces and implementations.

Далее представлены другие причины, из-за которых вам может потребоваться использовать интерфейсы вместо наследования классов.There are several other reasons why you might want to use interfaces instead of class inheritance:

  • Интерфейсы более удобны в ситуациях, в которых приложениям требуется множество возможно несвязанных типов объектов для предоставления определенных возможностей.Interfaces are better suited to situations in which your applications require many possibly unrelated object types to provide certain functionality.

  • Интерфейсы более гибкие, чем базовые классы, так как вы можете определить одну реализацию, в которой можно реализовать несколько интерфейсов.Interfaces are more flexible than base classes because you can define a single implementation that can implement multiple interfaces.

  • Интерфейсы предпочтительнее в случаях, в которых нет необходимости наследовать реализацию базового класса.Interfaces are better in situations in which you do not have to inherit implementation from a base class.

  • Интерфейсы полезны, когда невозможно использовать наследование класса.Interfaces are useful when you cannot use class inheritance. Например, структуры не могут наследовать от классов, но они могут реализовывать интерфейсы.For example, structures cannot inherit from classes, but they can implement interfaces.

Объявление интерфейсовDeclaring Interfaces

Определения интерфейса заключаются в операторы Interface и End Interface.Interface definitions are enclosed within the Interface and End Interface statements. После оператора Interface можно добавить необязательный оператор Inherits, в котором указывается один или несколько наследуемых интерфейсов.Following the Interface statement, you can add an optional Inherits statement that lists one or more inherited interfaces. Операторы Inherits должны предшествовать всем другим операторам в объявлении, за исключением комментариев.The Inherits statements must precede all other statements in the declaration except comments. Остальными операторами в определении интерфейса должны быть Event, Sub, Function, Property, Interface, Class, Structure и Enum.The remaining statements in the interface definition should be Event, Sub, Function, Property, Interface, Class, Structure, and Enum statements. Интерфейсы не могут содержать код реализаций или операторы, связанные с кодом реализации, такие как End Sub и End Property.Interfaces cannot contain any implementation code or statements associated with implementation code, such as End Sub or End Property.

В пространстве имен операторы интерфейса по умолчанию относятся к типу Friend, но также их можно явно объявить как Public или Friend.In a namespace, interface statements are Friend by default, but they can also be explicitly declared as Public or Friend. Интерфейсы, определенные в классах, модулях, интерфейсах и структурах по умолчанию объявлены как Public, но их также можно явно объявить как Public, Friend, Protected и Private.Interfaces defined within classes, modules, interfaces, and structures are Public by default, but they can also be explicitly declared as Public, Friend, Protected, or Private.

Примечание

Ключевое слово Shadows может применяться ко всем элементам интерфейса.The Shadows keyword can be applied to all interface members. Ключевое слово Overloads слово может применяться к операторам Sub, Function, и Property, объявленным в определении интерфейса.The Overloads keyword can be applied to Sub, Function, and Property statements declared in an interface definition. Кроме того, операторы Property могут содержать модификаторы Default, ReadOnly и WriteOnly.In addition, Property statements can have the Default, ReadOnly, or WriteOnly modifiers. Другие модификаторы (Public, Private, Friend, Protected, Shared, Overrides, MustOverride и Overridable) не разрешены.None of the other modifiers—Public, Private, Friend, Protected, Shared, Overrides, MustOverride, or Overridable—are allowed. Дополнительные сведения см. в разделе Контексты объявления и уровни доступа по умолчанию.For more information, see Declaration Contexts and Default Access Levels.

Например, в следующем примере кода определяется интерфейс с одной функцией, одним свойством и одним событием.For example, the following code defines an interface with one function, one property, and one event.

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

Реализация интерфейсовImplementing Interfaces

Visual Basic зарезервированного слова Implements используется двумя способами.The Visual Basic reserved word Implements is used in two ways. Оператор Implements означает, что класс или структура реализуют интерфейс.The Implements statement signifies that a class or structure implements an interface. Ключевое слово Implements указывает, что элемент класса или структуры реализует определенный элемент интерфейса.The Implements keyword signifies that a class member or structure member implements a specific interface member.

Оператор ImplementsImplements Statement

Если класс или структура реализует один или несколько интерфейсов, они должны содержать оператор Implements сразу после оператора Class или Structure.If a class or structure implements one or more interfaces, it must include the Implements statement immediately after the Class or Structure statement. Оператору Implements требуется разделенный запятыми список интерфейсов, которые должны быть реализованы с помощью класса.The Implements statement requires a comma-separated list of interfaces to be implemented by a class. Структура или класс должны реализовать все элементы интерфейса с помощью ключевого слова Implements.The class or structure must implement all interface members using the Implements keyword.

Ключевое слово ImplementsImplements Keyword

Ключевому слову Implements требуется разделенный запятыми список элементов интерфейса, которые необходимо реализовать.The Implements keyword requires a comma-separated list of interface members to be implemented. Как правило, указывается только один элемент интерфейса, но можно указать несколько элементов.Generally, only a single interface member is specified, but you can specify multiple members. Спецификация элемента интерфейса состоит из имени интерфейса, которое должно быть указано в операторе implements внутри класса, точки и имени реализуемой функции-члена, свойства или события.The specification of an interface member consists of the interface name, which must be specified in an implements statement within the class; a period; and the name of the member function, property, or event to be implemented. Имя члена, реализующего член интерфейса, может использовать любой допустимый идентификатор и не ограничивается InterfaceName_MethodNameным соглашением, используемым в более ранних версиях Visual Basic.The name of a member that implements an interface member can use any legal identifier, and it is not limited to the InterfaceName_MethodName convention used in earlier versions of Visual Basic.

Например, в следующем примере кода показано, как объявить подпрограмму с именем Sub1, в которой реализуется метод интерфейса:For example, the following code shows how to declare a subroutine named Sub1 that implements a method of an interface:

Class Class1
    Implements interfaceclass.interface2

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

Типы параметров и типы возвращаемого значения элемента реализации должны соответствовать объявлению свойства или элемента в интерфейсе.The parameter types and return types of the implementing member must match the interface property or member declaration in the interface. Наиболее распространенный способ реализации элемента интерфейса — использование элемента с таким же, как у интерфейса, именем, как показано в предыдущем примере.The most common way to implement an element of an interface is with a member that has the same name as the interface, as shown in the previous example.

Для объявления реализации метода интерфейса можно использовать любые атрибуты, которые допустимы в объявлении метода экземпляра, включая Overloads, Overrides, Overridable, Public, Private, Protected, Friend, Protected Friend, MustOverride, Default и Static.To declare the implementation of an interface method, you can use any attributes that are legal on instance method declarations, including Overloads, Overrides, Overridable, Public, Private, Protected, Friend, Protected Friend, MustOverride, Default, and Static. Атрибут Shared недопустим, поскольку он определяет класс, а не метод экземпляра.The Shared attribute is not legal since it defines a class rather than an instance method.

С помощью Implements можно также написать один метод, который реализует несколько методов, определенных в интерфейсе, как показано в следующем примере:Using Implements, you can also write a single method that implements multiple methods defined in an interface, as in the following example:

Class Class2
    Implements I1, I2

    Protected Sub M1() Implements I1.M1, I1.M2, I2.M3, I2.M4
    End Sub
End Class

Закрытый элемент можно использовать для реализации члена интерфейса.You can use a private member to implement an interface member. Если закрытый член реализует член интерфейса, этот элемент становится доступен через интерфейс, хотя он недоступен напрямую через переменные класса.When a private member implements a member of an interface, that member becomes available by way of the interface even though it is not available directly on object variables for the class.

Примеры реализации интерфейсовInterface Implementation Examples

Классы, реализующие интерфейс, должны реализовать все свойства, методы и события.Classes that implement an interface must implement all its properties, methods, and events.

В примере ниже определены два интерфейса.The following example defines two interfaces. Второй интерфейс, Interface2, наследует Interface1 и определяет дополнительное свойство и метод.The second interface, Interface2, inherits Interface1 and defines an additional property and method.

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, интерфейс, определенный в предыдущем примере:The next example implements Interface1, the interface defined in the previous example:

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:The final example implements Interface2, including a method inherited from 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

Можно реализовать свойство только для чтения со свойством, доступным для чтения и записи (т. е. не нужно объявлять его свойством только для чтения в классе реализации).You can implement a readonly property with a readwrite property (that is, you do not have to declare it readonly in the implementing class). В реализации интерфейса должны быть по крайней мере реализованы элементы, которые объявляются интерфейсом, но можно обеспечить дополнительные возможности, например разрешить запись свойства.Implementing an interface promises to implement at least the members that the interface declares, but you can offer more functionality, such as allowing your property to be writable.

НазваниеTitle ОписаниеDescription
Пошаговое руководство. Создание и реализация интерфейсовWalkthrough: Creating and Implementing Interfaces Содержит подробные процедуры, которые помогут вам определить и реализовать собственный интерфейс.Provides a detailed procedure that takes you through the process of defining and implementing your own interface.
Расхождение в универсальных интерфейсахVariance in Generic Interfaces В этом разделе описываются ковариация и контрвариация в универсальных интерфейсах, а также представлен список вариативных универсальных интерфейсов платформы .NET Framework.Discusses covariance and contravariance in generic interfaces and provides a list of variant generic interfaces in the .NET Framework.