Наследование (объектно-ориентированное программирование)


В объектно-ориентированном программировании наследование это механизм базирования объекта или класса на другом объекте ( наследование на основе прототипов ) или классе ( наследование на основе классов ) с сохранением аналогичной реализации . Также определяется как создание новых классов ( подклассов ) из существующих, таких как суперкласс или базовый класс, а затем формирование их в иерархию классов. В большинстве объектно-ориентированных языков, основанных на классах, объект, созданный посредством наследования, «дочерний объект», приобретает все свойства и поведение «родительского объекта», за исключением: конструкторов , деструктора,перегруженные операторы и дружественные функции базового класса. Наследование позволяет программистам создавать классы, основанные на существующих классах, [1] указывать новую реализацию, сохраняя при этом то же поведение ( реализуя интерфейс ), повторно использовать код и независимо расширять исходное программное обеспечение с помощью общедоступных классов и интерфейсов . Отношения объектов или классов через наследование порождают ориентированный ациклический граф .

Наследование было изобретено в 1969 году для Simula [2] и теперь используется во многих объектно-ориентированных языках программирования, таких как Java , C++ , PHP и Python .

Унаследованный класс называется подклассом родительского класса или суперклассом. Термин «наследование» широко используется как для программирования на основе классов, так и для программирования на основе прототипов, но в узком смысле этот термин зарезервирован для программирования на основе классов (один класс наследует от другого), с соответствующей техникой программирования на основе прототипов. вместо этого называется делегированием (один объект делегирует другому).

Наследование не следует путать с подтипированием . [3] [4] В некоторых языках наследование и подтипирование совпадают, [а] тогда как в других они различаются; в общем случае подтипирование устанавливает отношение " есть-а ", тогда как наследование повторно использует только реализацию и устанавливает синтаксическое отношение, не обязательно семантическое отношение (наследование не гарантирует поведенческого подтипирования). Чтобы различать эти концепции, наследование подтипов иногда называют наследованием интерфейса (без учета того, что специализация переменных типа также индуцирует отношение подтипа), тогда как наследование, как определено здесь, известно как наследование реализации или наследование кода.. [5] Тем не менее, наследование является широко используемым механизмом для установления отношений подтипов. [6]

Наследование противопоставляется композиции объектов , где один объект содержит другой объект (или объекты одного класса содержат объекты другого класса); см. состав над наследованием . Композиция реализует отношение « имеет- отношение», в отличие от отношения «есть-отношение» подтипа.

«Множественное наследование  ... считалось очень сложным для эффективной реализации. Например, в кратком изложении C++ в своей книге по Objective C Брэд Кокс на самом деле утверждал , что добавление множественного наследования в C++ невозможно. Таким образом, множественное наследование казалось Я не мог устоять перед вызовом, так как я рассматривал множественное наследование еще в 1982 году и нашел простую и эффективную технику реализации в 1984 году. Я подозреваю, что это единственный случай, когда мода повлияла на последовательность событий. ." [8]


Одиночное наследование
Множественное наследование
Многоуровневое наследование
Иллюстрация переопределения метода