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

Интерфейсы определяют свойства, методы и события, которые можно реализовать в классах. Интерфейсы позволяют определить возможности в виде небольших групп тесно связанных свойств, методов и событий. Это снижает число проблем совместимости, так как можно создавать усовершенствованные реализации интерфейсов без изменения существующего кода. Вы можете добавлять новые функции в любое время с помощью дополнительных интерфейсов и реализаций.

Далее представлены другие причины, из-за которых вам может потребоваться использовать интерфейсы вместо наследования классов.

  • Интерфейсы более удобны в ситуациях, в которых приложениям требуется множество возможно несвязанных типов объектов для предоставления определенных возможностей.

  • Интерфейсы более гибкие, чем базовые классы, так как вы можете определить одну реализацию, в которой можно реализовать несколько интерфейсов.

  • Интерфейсы предпочтительнее в случаях, в которых нет необходимости наследовать реализацию базового класса.

  • Интерфейсы полезны, когда невозможно использовать наследование класса. Например, структуры не могут наследовать от классов, но они могут реализовывать интерфейсы.

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

Определения интерфейса заключаются в операторы 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

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

Зарезервированное слово Implements Visual Basic используется двумя способами. Оператор Implements означает, что класс или структура реализуют интерфейс. Ключевое слово Implements указывает, что элемент класса или структуры реализует определенный элемент интерфейса.

Оператор Implements

Если класс или структура реализует один или несколько интерфейсов, они должны содержать оператор Implements сразу после оператора Class или Structure. Оператору Implements требуется разделенный запятыми список интерфейсов, которые должны быть реализованы с помощью класса. Структура или класс должны реализовать все элементы интерфейса с помощью ключевого слова 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

Можно реализовать свойство только для чтения со свойством, доступным для чтения и записи (т. е. не нужно объявлять его свойством только для чтения в классе реализации). В реализации интерфейса должны быть по крайней мере реализованы элементы, которые объявляются интерфейсом, но можно обеспечить дополнительные возможности, например разрешить запись свойства.

Заголовок Описание
Пошаговое руководство. Создание и реализация интерфейсов Содержит подробные процедуры, которые помогут вам определить и реализовать собственный интерфейс.
Вариативность в универсальных интерфейсах В этом разделе описываются ковариация и контрвариация в универсальных интерфейсах, а также представлен список вариативных универсальных интерфейсов платформы .NET Framework.