Наследование – одна из основных составляющих объектно-ориентированного программирования. Это один из способов, дающих возможность многократно использовать существующие классы (существующий код) в качестве фундамента для новых. Если один класс создан на основе другого (или других), говорят, что он наследует свой базовый класс. Наследование позволяет создать в программе иерархию типов. Это необходимая предпосылка для написания объектно-ориентрованной программы. Но наследования самого по себе недостаточно для того, чтобы считать программу объектно-ориентированной!
Наследование – это свойство объектов, благодаря которому экземпляры класса могут иметь доступ к данным и методам, содержащимся в ранее определенном классе, без повторного их определения.
Это означает, что новые классы наследуют структуру и поведение существующих классов. Существующие классы называются базовыми классами, а новые классы, которые наследуют их структуру и поведение – подклассами, классами-потомками или производнымиклассами.
Лодка
Базовый класс
Подводная лодка
Моторная лодка
Парусная лодка
Производные
классы
Рис. 1 – Базовые и производные классы
Наследование моделирует связь "это – является". Следовательно, можно сказать, что производный класс в свою очередь является базовым классом. Чтобы проверить является ли определенная наследственная связь корректной, нужно ответить на вопрос: "Может ли производный класс быть использован вместо базового класса?". Если ответ отрицательный, значит связь некорректна. Например, "Ладья – Это Шахматная Фигура".
В языках программирования наследование означает:
– с одной стороны, что поведение и данные, связанные с производным классом, являются расширением (то есть большим множеством) свойств, связанных с родительскими классами. Подкласс имеет все свойства родительского класса и, кроме того, дополнительные свойства;
– с другой стороны, поскольку производный класс является более специализированной (более ограниченной) формой родительского класса, он в определенном смысле, будет сужением родительского класса.
Класс может наследовать черты надклассов, отстоящих от него на несколько уровней. Например, собаки являются подклассом класса млекопитающих, а млекопитающие – подклассом типа животных. Следовательно, класс собак наследует свойства и всех млекопитающих, и всех животных.
Подклассы могут переопределять поведение, унаследованное от родительского класса. Например, класс утконосов переопределяет процедуру размножения, унаследованную от класса млекопитающих, поскольку утконосы откладывают яйца.
Рассматривая связь между типом данных, связанным с родительским классом, и типом данных, связанным с классом-потомком, можно утверждать следующее:
– представители подкласса должны владеть всеми областями данных родительского класса;
– представители подкласса должны обеспечивать, по крайней мере, через наследование (если нет явного переопределения), всех функциональных обязанностей родительского класса. У нового класса также могут появляться дополнительные обязанности;
– представитель производного класса может имитировать поведение родительского класса и должен быть неотличим от представителя родительского класса в сходных ситуациях.
Это описание идеализированного подхода к наследованию. Его можно формализовать в виде принципа подстановки: есть два класса А и В такие, что класс В является порожденным от класса А (подклассом) и может отстоять в иерархии на несколько ступеней. Для этих классов должна быть возможность подставить представителя класса В вместо представителя класса А в любой ситуации, причем без видимых последствий (изменений в поведении).
К связи вида "класс – подкласс", для которой выполнен принцип постановки, часто применяется термин "подтип". То есть подтип определяется в терминах поведения, а не структуры. Тип В является подтипом А, если в любой ситуации можно подставить экземпляр класса В вместо экземпляра класса А без каких-либо видимых изменений в поведении.
Например, двумерный массив может быть определен как подтип типа "массив".
Ход работы:
Задание 1. Наберите и проанализируйте программу. Определите в данной программе принципы наследования созданных классов. Объясните результаты выполнения программы.