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

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

Например, это может быть полезно в графическом редакторе. Рассмотрим, к примеру, следующий фрагмент кода, не использующий наследование:

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

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

На этом этапе следует снова убедиться, что производный класс имеет отношение тождественности или вместо него отношение включения. Если новый класс для рисования прямоугольников состоит только из линий, то наследование здесь является не лучшим выбором. Однако если новый прямоугольник является линией со свойством ширины, то сохраняется отношение тождественности.

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