Множнае спадкаваньне
Мно́жнае спадкава́ньне — магчымасьць пэўных аб’ектна-арыентаваных моваў праграмаваньня, у якіх кляса можа спадкаваць паводзіны і ўласьцівасьці ад больш чым адной бацькоўскай клясы. У гэтым заключаецца адрозьненьне ад простага спадкаваньня, калі кляса можа спадкаваць толькі адну бацькоўскую клясу.
Мовамі, якія пераважна падтрымліваюць множнае спадкаваньне, зьяўляюцца 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 году (па-ангельску).