
- •Тема 5.3. Средства объектно-ориентированного программирования в vb
- •5.3.1. Две роли классов в ооп и типы данных в vb
- •5.3.2. Средства создания классов в vb
- •5.3.2.1. Средства создания пользовательских классов
- •5.3.2.2. Пошаговое руководство для создания приложения с классами
- •Определение класса
- •Создание кнопки для тестирования класса
- •Запуск приложения
- •5.3.3. Взаимодействие, взаимное различие и сходство форм, модулей и классов
- •5.3.4. Создание объектной модели и приложений с использованием классов
- •5.3.5. Иерархия классов и наследование
- •Наследование и тождественность
- •Базовые классы и повторное использование кода
- •Взаимозаменяемые производные классы
- •Неполные иерархии классов
- •Глобальные изменения производных классов через базовый класс
- •Изменение структуры базовых классов после развертывания
- •Проблема уязвимости базовых классов
- •Сведение к минимуму проблем уязвимости базовых классов
- •5.3.6. Задачи для самостоятельного решения по теме «Средства объектно-ориентированного программирования в Visual Basic»
- •Практикум
- •5.3.7. Тестовые задания по теме «Средства объектно-ориентированного программирования в vb»
- •Тема 5.3. Средства объектно-ориентированного программирования в Visual Basic Страница 85
Взаимозаменяемые производные классы
Производные классы в иерархии классов иногда могут быть взаимозаменяемыми со своим базовым классом; данный процесс называется полиморфизмом на базе наследования. Данный подход сочетает лучшие черты полиморфизма на базе интерфейсов с возможностью повторного использования или переопределения кода из базового класса.
Например, это может быть полезно в графическом редакторе. Рассмотрим, к примеру, следующий фрагмент кода, не использующий наследование:
-
Sub Draw(ByVal Shape As DrawingShape, ByVal X AsInteger, _
ByVal Y AsInteger, ByVal Size AsInteger)
Select Case Shape.type
Case shpCircle
' Insert circle drawing code here.
Case shpLine
' Insert line drawing code here.
End Select
EndSub
При применении данного подхода возникает несколько проблем. Для последующего
включения эллипса будет необходимо изменить исходный код. Однако вполне
возможно, что у разработчика не будет доступа к исходному коду. Более сложной
проблемой является то, что для вычерчивания эллипса требуется еще один параметр (у эллипса есть малый и большой диаметры), не требующийся при вычерчивании линий. Чтобы добавить ломаную линию (множество соединенных линий), следует добавить еще один параметр, не требующийся в других случаях.
Большинство из этих проблем решается при помощи наследования. Хорошо разработанные базовые классы оставляют реализацию отдельных методов производным классам, что позволяет применять любые фигуры. Другие разработчики могут реализовывать методы в производных классах, используя документацию базовых классов. Другие члены (например координаты x и y) могут встраиваться в базовый класс, так как они используются всеми производными классами. Например, Draw может быть методом MustOverride:
-
MustInherit Class Shape
Public X As Integer
Public Y As Integer
MustOverride Sub Draw()
End Class
Затем можно добавлять к данному классу функциональные возможности для вычерчивания разных фигур. Например, для класса Line может требоваться только поле Length:
-
Class Line Inherits Shape
Public Length As Integer
Overrides Sub Draw()
' Insert code here to implement Draw for this shape.
End Sub
End Class
Этот подход полезен, так как при его использовании другие разработчики, не имеющие доступа к исходному коду, по мере необходимости могут расширять базовый класс новыми производными классами. Например, класс с именем Rectangle может быть получен из класса Line:
-
Class Rectangle Inherits Line
Public Width As Integer
Overrides Sub Draw()
' Insert code here to implement Draw for the Rectangle shape.
End Sub
End Class
Данный пример показывает, как можно перемещаться от классов общего назначения к специализированным классам, добавляя подробности реализации на каждом уровне.
На этом этапе следует снова убедиться, что производный класс имеет отношение тождественности или вместо него отношение включения. Если новый класс для рисования прямоугольников состоит только из линий, то наследование здесь является не лучшим выбором. Однако если новый прямоугольник является линией со свойством ширины, то сохраняется отношение тождественности.