Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Интерфейсы определяют свойства, методы и события, которые могут реализовать классы. Интерфейсы позволяют определять функции как небольшие группы тесно связанных свойств, методов и событий; это снижает проблемы совместимости, так как вы можете разрабатывать расширенные реализации для интерфейсов, не ставя под угрозу существующий код. Вы можете добавлять новые функции в любое время, разрабатывая дополнительные интерфейсы и реализации.
Существует несколько других причин, по которым может потребоваться использовать интерфейсы вместо наследования классов:
Интерфейсы лучше подходят для ситуаций, в которых приложениям требуется множество несвязанных типов объектов для предоставления определенных функций.
Интерфейсы являются более гибкими, чем базовые классы, так как можно определить одну реализацию, которая может реализовать несколько интерфейсов.
Интерфейсы лучше подходят для ситуаций, в которых не требуется наследовать реализацию базового класса.
Интерфейсы полезны, если не удается использовать наследование классов. Например, структуры не могут наследоваться от классов, но могут реализовывать интерфейсы.
Объявление интерфейсов
Определения интерфейсов заключены в операторы 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
инструкцию сразу после Class
или Structure
инструкции. Оператор 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
Свойство readonly можно реализовать с помощью свойства readwrite (т. е. не обязательно объявлять его в реализуемом классе). Реализация интерфейса подразумевает выполнение как минимум тех членов, которые объявлены интерфейсом, но вы можете добавить дополнительные возможности, включая возможность записи в свойство.
Связанные разделы
Название | Описание |
---|---|
Пошаговое руководство. Создание и реализация интерфейсов | Предоставляет подробную процедуру, которая проведет вас через процесс определения и реализации собственного интерфейса. |
Дисперсия в универсальных интерфейсах | Обсуждает ковариантность и контравариантность в универсальных интерфейсах и предоставляет список вариантов универсальных интерфейсов в .NET Framework. |