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


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

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

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

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

В 1966 году Тони Хоар представил некоторые замечания о записях и, в частности, представил идею подклассов записей, типов записей с общими свойствами, но отличающихся тегом варианта и имеющих поля, частные для варианта. [8] Под влиянием этого в 1967 году Оле-Йохан Даль и Кристен Нигаард представили проект, который позволял указывать объекты, принадлежащие к разным классам, но обладающие общими свойствами. Общие свойства были собраны в суперклассе, и каждый суперкласс сам потенциально мог иметь суперкласс. Таким образом, значения подкласса были составными объектами, состоящими из некоторого количества префиксных частей, принадлежащих различным суперклассам, плюс основная часть, принадлежащая подклассу. Все эти части были соединены вместе.[9] Атрибуты составного объекта будут доступны через точечную нотацию. Эта идея впервые была принята в языке программирования Simula 67. [10] Затем эта идея распространилась на Smalltalk , C++ , Java , Python и многие другие языки.


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