Интерфейсы (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. |