Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Тема-05-03испр.docx
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
376.1 Кб
Скачать
  1. Наследование и тождественность

В объектно-ориентированном программировании представлены два вида отношений между классами: отношения тождественности и включения. В отношениях тождественности производный класс явно является видом базового класса. Например, класс  PremierCustomer (важный клиент) тождественен с базовым классом Customer (клиент), поскольку важный клиент является клиентом. Однако класс CustomerReferral (сведения о клиенте) включен в класс Customer, поскольку сведения о клиенте включают в себя понятие клиента, но не являются типом клиента.

Объекты в иерархии наследования должны иметь отношения тождественности с их базовым классом, так как они наследуют поля, свойства, методы и события, определенные в базовом классе. Классы, имеющие с другими классами отношения включения, не подходят для иерархий наследования, так как могут унаследовать неподходящие свойства и методы. Например, если класс CustomerReferral был получен из класса Customer (об это говорилось ранее), он может наследовать свойства, не имеющие смысла, такие как  ShippingPrefs и LastOrderPlaced. Отношения включения должны быть представлены при помощи несвязанных классов или интерфейсов. Далее показан пример отношений тождественности и включения.

  1. Базовые классы и повторное использование кода

Другой причиной использования наследования является возможность повторного использования кода. Хорошо разработанные классы можно один раз отладить и потом много раз использовать в качестве основы для новых классов.

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

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

Хотя повторное использование кода на базе наследования является мощным

средством, у него есть и недостатки. Даже хорошо разработанные системы иногда

начинают изменяться так, как не было предусмотрено разработчиками. Изменение

существующей иерархии классов иногда может иметь непредусмотренные

последствия.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]