Мно́жественное насле́дование — свойство, поддерживаемое частью объектно-ориентированных языков программирования, когда класс может иметь более одного суперкласса (непосредственного класса-родителя), интерфейсы поддерживают множественное наследование во многих языках программирования. Эта концепция является расширением «простого (или одиночного) наследования» (англ. single inheritance), при котором класс может наследоваться только от одного суперкласса.
В список языков, поддерживающих множественное наследование, входят: Io, Eiffel, C++, Dylan, Python, некоторые реализации классов JavaScript (например, dojo.declare), Perl 6, Curl, Common Lisp (благодаря CLOS), OCaml, Tcl (благодаря Incremental Tcl)[1], а также Object REXX (за счёт использования классов-примесей).
Множественное наследование позволяет классу перенимать функциональность у множества других классов, как например, класс StudentMusician
может наследовать от класса Person
, класса Musician
и класса Worker
, что сокращённо можно написать:
StudentMusician : Person, Musician, Worker
.
Неопределённость при множественном наследовании, как в примере выше, возникает если, к примеру, класс Musician
наследует от классов Person
и Worker
, а класс Worker
, в свою очередь, наследует от Person
; подобная ситуация называется ромбовидным наследованием. Таким образом, у нас получаются следующие правила:
Worker : Person Musician : Person, Worker StudentMusician : Person, Musician, Worker
Если компилятор просматривает класс StudentMusician, то ему необходимо знать, нужно ли объединять возможности классов или они должны быть раздельными. Например, логично будет присоединить «Age» (возраст) класса Person к классу StudentMusician. Возраст человека не меняется, если вы рассматриваете его как Person (человек), Worker (рабочий) или Musician (музыкант). Однако, будет довольно логичным отделить свойство «Name» (имя) в классах Person и Musician, если они используют сценический псевдоним, отличающийся от настоящего имени. Варианты объединения и разделения вполне корректны для каждого из собственных контекстов и только программист знает, какой вариант является правильным для проектируемого класса.
Языки обладают различными способами разрешения таких проблем вложенного наследования, например:
A: B, B
.Worker::Person
» и «Musician::Person
» будут ссылаться на один и тот же объект).Smalltalk, C#, Objective-C, Java, Nemerle и PHP не допускают множественного наследования, что позволяет избежать многих неопределенностей. Однако, они, кроме Smalltalk, позволяют классам реализовать множественные интерфейсы. Кроме того, PHP и Ruby позволяют эмулировать множественное наследование за счет использования примесей (traits в PHP и mixins в Ruby), которые, как и интерфейсы, полноценными классами не являются. Множественное наследование интерфейсов позволяет расширить ограниченные возможности.
В этой статье не хватает ссылок на источники информации. |
Множественное наследование критикуется за следующие проблемы, возникающие в некоторых языках, в частности, C++:
Множественное наследование в языках с конструкторами в стиле C++/Java усиливает проблему наследования конструкторов и последовательностей конструкторов, таким образом создавая проблемы с поддержкой и расширяемостью в этих языках. Объекты в отношениях наследования со значительно отличающимися методами конструирования довольно трудны для реализации в рамках парадигмы последовательности конструкторов.
Тем не менее, существуют языки, обрабатывающие эти технические тонкости (например Eiffel).
Существует мнение, что множественное наследование — это неверная концепция, порождённая неверным анализом и проектированием. В частности, для приведённого выше примера справедлив следующий вариант проектирования. Класс Person включает в себя один и более объектов класса Profession. Классы Student и Musician наследуют от Profession. Таким образом, StudentMusician будет представлен объектом класса Person содержащим объекты класса Student и Musician. Формально множественное наследование можно перепроектировать путём введения класса, являющегося «метаклассом» классов, от которых должно происходить множественное наследование. В приведённом примере таким метаклассом является Profession — профессия.
Для улучшения этой статьи по информационным технологиям желательно: |
Данная страница на сайте WikiSort.ru содержит текст со страницы сайта "Википедия".
Если Вы хотите её отредактировать, то можете сделать это на странице редактирования в Википедии.
Если сделанные Вами правки не будут кем-нибудь удалены, то через несколько дней они появятся на сайте WikiSort.ru .