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

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

Мовамі, якія пераважна падтрымліваюць множнае спадкаваньне, зьяўляюцца 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 году (па-ангельску).