Множнае спадкаваньне

**Мно́жнае спадкава́ньне** — магчымасьць пэўных аб’ектна-арыентаваных моваў праграмаваньня, у якіх кляса можа спадкаваць паводзіны і ўласьцівасьці ад больш чым адной бацькоўскай клясы. У гэтым заключаецца адрозьненьне ад **простага спадкаваньня**, калі кляса можа спадкаваць толькі адну бацькоўскую клясу.

Мовамі, якія пераважна падтрымліваюць множнае спадкаваньне, зьяўляюцца Eiffel, C++, Python, Perl і CLOS (LISP).

## Асноўныя рысы
Множнае насьледваньне дазваляе клясе ўвабраць функцыянальнасьць некалькіх клясаў, напрыклад, дазваляючы клясе `СтудэнтМузыка` спадкавацца ад клясаў `Асоба`, `Музыка` і `Супрацоўнік`. Такая структура можна быць скарочаная да выразу `СтудэнтМузыка: Асоба, Музыка, Супрацоўнік`.

Але пры выкарыстаньні гэтага мэханізму можа ўзьнікнуць нявызначанасьць. Напрыклад, разглядаючы вышэйзгаданы прыклад, калі кляса Музыка будзе спадкаваць клясы Асоба і Супрацоўнік, а кляса Супрацоўнік будзе спадкаваць клясу Асоба. Пры гэтым будуць ужытыя наступныя правілы:

 СтудэнтМузыка: Асоба, Музыка, Супрацоўнік
 Музыка: Асоба, Супрацоўнік
 Супрацоўнік: Асоба

Калі кампілятар разклядае клясу СтудэнтМузыка, яму неабходна ведаць, як паводзіць сябе з ідэнтычнымі ўласьцівасьцямі: варта іх аб’яднаць разам або яны мусяць быць асобнымі ўласьцівасьцямі. Безумоўна, будзе сэнс уключыць уласьцівасьць «Век» клясы Асоба ў склад клясы СтудэнтМузыка. Век асобы не зьмяняецца, калі разглядяць яе як Асобу, як Супрацоўніка альбо як Музыку. Аднак, ёсьць сэнс разьмежаваць уласьцівасьць «Імя» клясаў Асоба і Музыка ў тым выпадку, калі яна выкарыстоўвае розныя сцэнічны псэўданім і сапраўднае імя. Варыянты аб’ядняньня і разьмежаваньня маюць сэнс кожны ў сваім уласным кантэксьце і толькі праграміст ведае, які зь іх зьяўляецца карэктным для клясы, якую ён праектуе.

## Абыходжаньне праблемы паўторнага спадкаваньня
Розныя мовы праграмаваньня маюць розныя шляхі абыходжаньня з такімі праблемамі паўторнага спадкаваньня.

* Eiffel дазваляе праграмісту яўна аб’яднаць альбо падзяліць уласьцівасьці, якія спадкуюцца ад бацькоўскіх клясаў. Калі ўласьцівасьці маюць аднолькавае імя і рэалізацыю, Eiffel аб’яднае іх разам. У аўтара клясы ёсьць магчымасьць перайменаваць спадкаваныя ўласьцівасьці, каб падзяліць іх. Eiffel таксама падтрымлівае яўнае паўторнае спадкаваньне, кшталту A: B, B.
* C++ патрабуе вызначэньня, якую бацькоўскую клясу ўласьцівасьці, якую трэба ўжыць, неабходна выкарыстаць. Напрыклад: «Супрацоўнік::Асоба.Век». C++ не падтрымлівае яўнае паўторнае спадкаваньне з прычыны таго, што ў адваротным выпадку ня будзе сродку вызначыць, якую бацькоўскую клясу выкарыстоўваць.
* Perl разглядае сьпіс клясаў спадкаваньня як адсартаваны. Кампілятар выкарыстоўвае першы мэтад, які ён знойдзе. Пры пошуку мэтадаў выкарыстоўваецца пошук у шырыню сярод сьпісу бацькоўскіх клясаў. Python выкарыстоўвае той жа прынцып, але ў адрозьненьне ад Perl уключае сьпіс клясаў спадкаваньня ў сынтаксіс мовы.
* CLOS падтрымлівае поўнае кіраваньне камбінацыяй мэтадаў, і нават калі гэтага не дастаткова, пратакол мэтааб’ектаў прадастаўляе праграмісту магчымасьць *зьмяняць* спадкаваньне, выклік мэтадаў, утварэньне клясаў і іншыя ўнутраныя мэханізмы без узьдзеяньня на стабільнасьць сыстэмы.
* Logtalk падтрымлівае абодва віды множнага спадкаваньня: як інтэрфэйсны, так і шляхам яўнай рэалізацыі, дазваляючы абвяшчэньне *псэўданімаў* мэтадаў, якія адначаова прадастаўляюць перайменаваньне мэтадаў і доступ да іх. У выніку праблемы множнага спадкаваньня будуць схаваныя мэханізмам вырашэньня канфліктаў, які выкарыстоўваецца па змоўчаньні.

Java, Nemerle, C#, PHP і Objective-C не дазваляюць выкарыстоўваць множнае спадкаваньне, такім чынам прадухіляючы нявызначанасьць. Аднак, Java, Nemerle, C# і PHP 5-й вэрсіі падтрымліваюць спадкаваньне клясаў ад некалькіх інтэрфэйсаў, што ўсё-ткі спараджае пэўныя праблемы, як, накрыклад, праблема апісаная вышэй.

## Спрэчкі
Існуюць спрэчкі наконт таго, ці можа быць множнае спадкаваньне рэалізаванае проста і безь нявызначанасьцяў. Часта множнае спадкаваньне крытыкуецца з-за падвышэньня складанасьці і нявызначанасьці, а таксама з-за праблемаў разьвіцьця і падтрымкі праграмнага прадукту, якія яно можа выклікаць.

Праціўнікі таксама сьцьвярджаюць, што праблемы рэалізацыі множнага спадкаваньня, кшталту немагчымасьці яўнага спадкаваньня ад некалькіх клясаў і парадак спадкаваньня, парушаюць сэмантыку клясы. Існуюць мовы, якія дазваляюць кантраляваць усе тэхнічныя дэталі множнага спадкаваньня, але галоўнай спрэчкай застаецца тое, ці сапраўды рэалізацыя і выкарыстаньне множнага спадкаваньня прасьцейшая за выкарыстаньне простага спадкаваньня і шаблёнаў праектаваньня.

## Дадатковая інфармацыя
* Б’ярн Страўструп (1999). ''Множнае спадкаваньне ў C++''. Вынікі веснавой Эўрапейскай канфэрэнцыі групы карыстальнікаў Unix 1987 году (па-ангельску).

Катэгорыя:Аб’ектна-арыентаванае праграмаваньне