Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Информатика 3-4(ЯП)+.doc
Скачиваний:
133
Добавлен:
10.06.2015
Размер:
681 Кб
Скачать
☆

Интерфейс класса в vb и его наследование

Подход к реализации объектно-ориентированной парадигмы программирования в VB основанной на идеи о модулях класса приводит к смешению двух самостоятельных концепций: интерфейса и реализации класса. Интерфейс класса это список свойств методов и событий, поддерживаемых данным классом. Реализация это программный код всех компонентов класса, определяющий его реальную работу. VB освобождает программиста от необходимости разделять эти два понятия. Программист, создавая модуль класса одновременно создает его интерфейс и реализация. Интерфейс класса в VB явно закладывается с его реализацией.

В ЯП C++ и OP эти два понятия явно разделяются. Однако VB позволяет сделать тоже самое, но только для определения интерфейса здесь необходимо создать отдельный класс – класс интерфейса.

Класс интерфейса делает возможным реализацию одной из важнейших идей ООП – наследование (inheritance), то есть воспроизведение признаков некоторого класса-предка (ancestor) классом-потомком (descendant). Класс интерфейса содержит только объявления свойств, методов и событий и не содержит никакого исполняемого кода. Интерфейс, описанный в классе интерфейса должен быть реализован в другом классе, в классе реализации. Для указания какой интерфейс должен унаследовать класс реализации необходимо в классе реализации указать ключевое слово IMPLEMENTS с именем класса интерфейса. Класс реализации обязан реализовать все описанные методы и свойства, которые должны быть отмечены в нем спецификатором PRIVATE.

Интерфейс является в некотором смысле контрактом, который обязуются реализовать все класса реализации, которые наследуют этот интерфейс. При этом сама реализация этого интерфейса не является с точки зрения наследования важной. Концепция интерфейсов крайне важна при реализации программного обеспечения так как позволяет определить однотипные методы обработки различных данных. Например, можно определить интерфейс IPersonalData, который описывает свойства и методы работы с некоторыми личными данными обобщенного объекта реального мира (сотрудников, заказчиков, поставщиков и т.д.). Однако реальные методы представления этих данных для каждого типа могут различаться.

Рассмотрим более подробно реализацию концепции интерфейсов и их наследования в VB. Для простоты объявим класс интерфейса IAnimal, который содержит описание двух методов Move (передвигаться) и Bite (касаться). Класс интерфейс также как и класса реализации объявляется в модуле класса, однако методы в классе интерфейса не содержат исполняемого кода:

Public Sub Move (ByVal Distance As Double)

'исполняемый код отсутствует

End Sub

Public Sub Bite (ByVal What As Object)

'исполняемый код отсутствует

End Sub

Реализуем данный интерфейс в класса реализации Flea («блоха»). Для указания того, что класс обязан реализовать интерфейс необходимо после ключевого слова IMPLEMENTS указать имя интерфейса:

Implements IAnimal

Private Sub IAnimal_Move(ByVal Distance As Double)

MsgBox "Flea moved" & Distance

End Sub

Private Sub IAnimal_Bite(ByVal What As Object)

MsgBox "Flea bit a " & TypeName(What)

End Sub

и также в классе Dog («собака»):

Implements Animal

Private Sub IAnimal_Move(ByVal Distance As Double)

MsgBox "Dog moved" & Distance

End Sub

Private Sub IAnimal_Bite(ByVal What As Object)

MsgBox "Dog bit a " & TypeName(What)

End Sub

Несмотря на то, что в классе интерфейса методы Move и Bite объявлены как открытые, однако в классах реализации эти методы должны быть определены как закрытые. В классах реализации идентификатор наследуемого метода трансформируется путем префиксного присоединения имени интерфейса и символа подчеркивания к исходному идентификатору метода. В данном примере метод Bite получает параметр типа Object. Данный тип совместим с любыми объектными типами языка VB позволяет получить адресую ссылку объекта любого класса. Функция TypeName возвращает идентификатор типа скалярной или объектной переменной.

Использование функциональности класса реализации, наследующего интерфейс в VB возможно только от имени соответствующего класса интерфейса. Эта особенность обусловлена тем, что все объекты в VB являются на бинарном уровне COM-объектами. С точки зрения синтаксиса, наследуемые методы являются закрытыми и поэтому недоступны непосредственно для клиентов класса реализации. Задача обеспечения доступа к функциональности таких классов решается в МИ следующим образом:

Dim fl As Flea 'объявляем объект «блоха»

Dim dg As Dog 'объявляем объект «собака»

Dim anim As IAnimal 'объявляем интерфейс «животное»

Set fl = New Flea 'конструируем «блоху»

Set ty = New Dog 'конструируем «собаку»

'назначим ссылку на объект «блоха» интерфейсу

'теперь «животное» – это «блоха»

Set anim = fl

anim.Bite dg 'Блоха кусает собаку

'назначим ссылку на объект «собака» интерфейсу

'теперь «животное» – это «собака»

Set anim = dg

anim.Bite fl '«собака» кусает «блоху»

В версии языка включенной в состав среды разработки Visual Basic 6.0 поддерживается только наследование интерфейса, тогда как наследование реализации одного класса другим классом невозможно. Эта важная возможность доступна в более развитых объектно-ориентированных языках программирования (С++, OP, Java, C#, VB.NET) позволяет существенным образом сократить количество избыточно программного кода при интенсивном использовании наследовании реализации.

1Здесь и далее ссылки на команды следует читать следующим образом: команда «Редактор VisualBasic» в подменю «Макрос» меню «Сервис».

2Элемент оконного интерфейса, который может располагаться «свободно» внутри родительского окна или «жестко» присоединяться к его границам, а также границам других стыковочных окон.

3Здесь и далее, треугольные скобки указывают на обязательный элемент, а прямоугольные на элемент который может быть пропущен в языковой конструкции