Поделиться через


Интерфейсы (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. Ни один из других модификаторов ,PublicPrivate , Friend, ProtectedSharedOverridesMustOverride, или 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.