Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
мини конспект по ООП.doc
Скачиваний:
35
Добавлен:
25.03.2015
Размер:
241.66 Кб
Скачать

20. Основные формы наследования?

Наследование применяется по-разному и не всегда обеспечивает порождение подтипов. Более того, иногда происходит так, что различные методы класса реализуют наследование по-разному.

Наиболее часто используемые формы наследования:

1) специализация– класс-потомок является более конкретным, частным или специализированным случаем родительского класса.

Например, класс окон Window предоставляет общие операции работы с окнами (сдвиг, изменение размеров, свертывание и т.д.). Специализированный подкласс текстовых окон TextEditWindow наследует операции работы с окнами и дополнительно обеспечивает средства, позволяющие окну отображать текстовую информацию, а пользователю – ее редактировать.

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

2) спецификация– родительский класс описывает поведение, которое реализуется в классе-потомке, но оставлено нереализованным в родительском.

Такая форма наследования гарантирует поддержку классами определенного общего интерфейса, то есть реализацию ими одних и тех же методов. Родительский класс может быть комбинацией реализованных операций и операций, осуществление которых доверено подклассам. Часто нет никаких отличий в интерфейсе между родительским и порожденным классами– последний просто обеспечивает выполнение описанного, но не реализованного в родительском классе поведения.

Например, в программе, имитирующей игру в бильярд, создан абстрактный класс "Графические объекты", в котором описаны, но не реализованы методы отображения объектов и их реакция на соприкосновение с шаром. Для воплощения этих методов порождены подклассы "Шар", "Стенка" и "Луза".

3) конструирование– класс-потомок использует методы, предоставляемые родительским классом, но представители подкласса не подставляются туда, где используются представители родительского класса.

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

4) обобщение– класс-потомок модифицирует или переопределяет некоторые методы родительского класса, чтобы получить объект более общей категории.

При данной форме наследования потомок расширяет родительский класс для создания объекта более общего типа.

Например, в системе графического отображения определен класс Window для черно-белого фона. Для создания цветных графических окон определен класс ColoredWindow Цвет фона будет отличаться от белого за счет добавления нового поля, содержащего цвет. Также переопределяется наследуемая процедура изображения окна, в которой происходит фоновая заливка.

Такая форма наследования часто используется в случае, когда общий проект основывается в первую очередь на значениях данных и меньше – на функциональном поведении (в данном примере цветное окно содержит поля данных, необязательные в случае черно-белого окна).

5) расширение– класс-потомок добавляет новые функциональные возможности к родительскому классу, но не меняет наследуемое поведение.

Например, существует класс множеств "Множества". Подклассом для расширения в данном случае будет класс-потомок "Строковые множества", созданный для хранения строковых величин. Этот подкласс мог бы предоставлять дополнительные методы для работы со строками, например, поиск подстроки и т.д.

6) ограничение– класс-потомок ограничивает использование некоторых методов родительского класса.

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

Такая форма наследования является явным нарушением принципа подстановки и строит подклассы, не являющиеся подтипами, поэтому по возможности следует избегать использования наследования для ограничения.

7) варьирование– производный и родительский классы являются вариациями на одну тему, и связь "класс – подкласс" произвольна.

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

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

– можно произвольно выбрать один из этих классов в качестве родителя, при этом другой класс наследует общую часть программного кода и переопределяет код, зависящий от устройства;

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

8) комбинирование– это создание подкласса, представляющего собой комбинацию двух или более родительских классов. То есть класс-потомок наследует черты более чем одного родительского класса. Это – множественное наследование.

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