Наследование (программирование)
- 1 year ago
- 0
- 0
Мно́жественное насле́дование — свойство, поддерживаемое частью объектно-ориентированных языков программирования , когда класс может иметь более одного суперкласса (непосредственного класса-родителя), интерфейсы поддерживают множественное наследование во многих языках программирования. Эта концепция является расширением «простого (или одиночного) наследования » ( англ. single inheritance ), при котором класс может наследоваться только от одного суперкласса.
В список языков, поддерживающих множественное наследование, входят: Io , Eiffel , C++ , Dylan , Python , некоторые реализации классов JavaScript (например, dojo .declare), Perl 6 , Curl , Common Lisp (благодаря CLOS ), OCaml , Tcl (благодаря Incremental Tcl ) , а также 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 — профессия.
Для улучшения этой статьи по информационным технологиям
желательно
:
|