
- •Тема 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
Наследование и тождественность
В объектно-ориентированном программировании представлены два вида отношений между классами: отношения тождественности и включения. В отношениях тождественности производный класс явно является видом базового класса. Например, класс PremierCustomer (важный клиент) тождественен с базовым классом Customer (клиент), поскольку важный клиент является клиентом. Однако класс CustomerReferral (сведения о клиенте) включен в класс Customer, поскольку сведения о клиенте включают в себя понятие клиента, но не являются типом клиента.
Объекты в иерархии наследования должны иметь отношения тождественности с их базовым классом, так как они наследуют поля, свойства, методы и события, определенные в базовом классе. Классы, имеющие с другими классами отношения включения, не подходят для иерархий наследования, так как могут унаследовать неподходящие свойства и методы. Например, если класс CustomerReferral был получен из класса Customer (об это говорилось ранее), он может наследовать свойства, не имеющие смысла, такие как ShippingPrefs и LastOrderPlaced. Отношения включения должны быть представлены при помощи несвязанных классов или интерфейсов. Далее показан пример отношений тождественности и включения.
Базовые классы и повторное использование кода
Другой причиной использования наследования является возможность повторного использования кода. Хорошо разработанные классы можно один раз отладить и потом много раз использовать в качестве основы для новых классов.
Обычный пример эффективного повторного использования кода относится к библиотекам, управляющим структурами данных. Предположим, что у пользователя есть большое бизнес-приложение, управляющее несколькими видами списков в памяти. Один из них является копией базы данных заказчиков, считанной в память из базы данных в начале сеанса для увеличения скорости работы. Структура данных может выглядеть следующим образом:
-
Class CustomerInfo
Protected PreviousCustomer As CustomerInfo
Protected NextCustomer As CustomerInfo
Public ID AsIntegerPublic FullName As String
Public Sub InsertCustomer(ByVal FullName AsString)
' Insert code to add a CustomerInfo item to the list.
End Sub
Public Sub DeleteCustomer()
' Insert code to remove a CustomerInfo item from the list.
End Sub
Public Function GetNextCustomer() As CustomerInfo
' Insert code to get the next CustomerInfo item from the
Return NextCustomer
End Function
PublicFunction GetPrevCustomer() As CustomerInfo
'Insert code to get the previous CustomerInfo item from the list
Return PreviousCustomer
End Function
End Class
Приложение также может иметь похожий список продуктов, добавленных
пользователем, как показано в следующем фрагменте кода:
-
Class ShoppingCartItem
Protected PreviousItem As ShoppingCartItem
Protected NextItem As ShoppingCartItem
Public ProductCode As Integer
Public Function GetNextItem() As ShoppingCartItem
' Insert code to get the next ShoppingCartItem from the list.
Return NextItem
End Function
EndClass
Здесь можно увидеть некий шаблон: два списка производят одни и те же операции
(вставка, удаление и извлечение), но работают с разными типами данных.
Управление двумя базами кода для выполнения фактически одинаковых функций
неэффективно. Наилучшим решением в данном случае является выделение
управления списками в отдельный класс, а затем наследование из этого класса для
различных типов данных:
-
Class ListItem
Protected PreviousItem As ListItem
Protected NextItem As ListItem
Public Function GetNextItem() As ListItem
' Insert code to get the next item in the list.
Return NextItem
End Function
PublicSub InsertNextItem()
' Insert code to add a item to the list.
End Sub
Public Sub DeleteNextItem()
' Insert code to remove a item from the list.
End Sub
Public Function GetPrevItem() As ListItem
'Insert code to get the previous item from the list.
Return PreviousItem
End Function
EndClass
Класс ListItem требует только однократной отладки. Затем можно строить
классы, использующие данный класс, не заботясь больше об управлении списками.
Например,
-
Class CustomerInfo
Inherits ListItem Public ID As Integer
Public FullName As String
End Class
Class ShoppingCartItem Inherits ListItem
Public ProductCode As Integer
End Class
Хотя повторное использование кода на базе наследования является мощным
средством, у него есть и недостатки. Даже хорошо разработанные системы иногда
начинают изменяться так, как не было предусмотрено разработчиками. Изменение
существующей иерархии классов иногда может иметь непредусмотренные
последствия.