Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«ΠžΡΠ½ΠΎΠ²Ρ‹ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ программирования». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 156

Автор Π‘Π΅Ρ€Ρ‚Ρ€Π°Π½ ΠœΠ΅ΠΉΠ΅Ρ€

ΠŸΠ΅Ρ€Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π² ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ², ΠΌΡ‹ с Π»Π΅Π³ΠΊΠΎΡΡ‚ΡŒΡŽ сдСлаСм D ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΌ:


class D inherit

-- Π­Ρ‚ΠΎΡ‚ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ класса Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π΅Π½.

B

rename portends_trouble as does_not_portend_trouble_any_more end

C

end



ΠšΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΉ

Пока Π² Ρ…ΠΎΠ΄Π΅ наслСдования ΠΌΡ‹ мСняли лишь ΠΈΠΌΠ΅Π½Π°. А Ρ‡Ρ‚ΠΎ, Ссли ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹ΠΉ ΠΏΡ€Π΅Π΄ΠΎΠΊ, Ρ‚Π°ΠΊΠΎΠΉ, ΠΊΠ°ΠΊ B ΠΈΠ»ΠΈ C (см. послСдний рисунок), ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ Π΄ΡƒΠ±Π»ΠΈΡ€ΡƒΠ΅ΠΌΠΎ наслСдуСмый ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚? ΠŸΡ€ΠΈ динамичСском связывании это ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ нСоднозначности Π² D.

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ Ρ€Π΅ΡˆΠ°ΡŽΡ‚ Π΄Π²Π° простых ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ°: ΠΎΡ‚ΠΌΠ΅Π½Π° опрСдСлСния (undefinition) ΠΈ Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ (selection). Как ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ, Π²Ρ‹ сами ΠΏΡ€ΠΈΠΌΠ΅Ρ‚Π΅ участиС Π² ΠΈΡ… Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ ΠΈ ΡƒΠ±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ Ρ‡Π΅Ρ‚ΠΊΠΎΠΉ постановкС Π·Π°Π΄Π°Ρ‡ΠΈ нуТная конструкция языка становится ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎΠΉ.

ΠŸΡƒΡΡ‚ΡŒ Π΄ΡƒΠ±Π»ΠΈΡ€ΡƒΠ΅ΠΌΠΎ наслСдуСмый ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ пСрСопрСдСляСтся Π² ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· Π²Π΅Ρ‚Π²Π΅ΠΉ:

Рис. 15.21.  ΠŸΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ - ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π° ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ нСоднозначности

Класс B пСрСопрСдСляСт f. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π² D этот ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ прСдставлСн Π² Π΄Π²ΡƒΡ… Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π°Ρ…: Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ пСрСопрСдСлСния Π² B ΠΈ исходный Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ ΠΈΠ· A, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ Ρ‡Π΅Ρ€Π΅Π· класс C. (МоТно ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΈ C пСрСопрСдСляСт f, Π½ΠΎ это Π½Π΅ внСсСт Π² нашС рассуТдСниС Π½ΠΈΡ‡Π΅Π³ΠΎ Π½ΠΎΠ²ΠΎΠ³ΠΎ.) Π’Π°ΠΊΠΎΠ΅ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄Π΅Π» отличаСтся ΠΎΡ‚ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… случаСв, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΡ‹ ΠΈΠΌΠ΅Π»ΠΈ лишь ΠΎΠ΄ΠΈΠ½ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, наслСдуСмый ΠΏΠΎΠ΄ Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ.

Π§Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅? ΠžΡ‚Π²Π΅Ρ‚ зависит ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΏΠΎΠ΄ ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ»ΠΈ Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ класс D наслСдуСт Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ². ΠŸΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π΅Ρ‚ Π»ΠΈ Π΄ΡƒΠ±Π»ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ΅ наслСдованиС Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡŽ ΠΈΠ»ΠΈ совмСстноС использованиС? Рассмотрим эти случаи ΠΏΠΎ порядку.

ΠšΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ ΠΏΡ€ΠΈ совмСстном использовании: ΠΎΡ‚ΠΌΠ΅Π½Π° опрСдСлСния ΠΈ соСдинСниС ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ²

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ Π²Π½Π°Ρ‡Π°Π»Π΅, Ρ‡Ρ‚ΠΎ Π΄Π²Π΅ вСрсии Π½Π°ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ΡΡ ΠΏΠΎΠ΄ ΠΎΠ΄Π½ΠΈΠΌ ΠΈ Ρ‚Π΅ΠΌ ΠΆΠ΅ ΠΈΠΌΠ΅Π½Π΅ΠΌ. Π­Ρ‚ΠΎ случай совмСстного использования. ΠžΠ΄Π½ΠΎΠΌΡƒ ΠΈΠΌΠ΅Π½ΠΈ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π² точности ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ Ρ‚Ρ€ΠΈ ситуации.

1 Если ΠΎΠ΄Π½Π° вСрсия ΠΎΡ‚Π»ΠΎΠΆΠ΅Π½Π°, Π° другая - эффСктивна, Ρ‚ΠΎ слоТностСй Π½Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚, Π±ΡƒΠ΄Π΅Ρ‚ использован эффСктивный Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°. Π—Π°ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ этот случай явно прСдусмотрСн ΠΏΡ€Π°Π²ΠΈΠ»ΠΎΠΌ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ: Ρ€Π΅Ρ‡ΡŒ Π² Π½Π΅ΠΌ ΠΈΠ΄Π΅Ρ‚ лишь ΠΎ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Π΅ ΠΈΠΌΠ΅Π½ Π΄Π²ΡƒΡ… эффСктивных вСрсий.

2 КаТдая вСрсия эффСктивна, ΠΎΠ΄Π½Π°ΠΊΠΎ ΠΎΠ±Π΅ ΠΎΠ½ΠΈ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ Π² D Π² ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠΈ redefine. ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ снова Π½Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ±Π΅ вСрсии ΡΠ»ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π² ΠΎΠ΄Π½Ρƒ, ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΠ΅ΠΌΡƒΡŽ Π² тСкстС класса.

3 ОбС вСрсии эффСктивны, Π½ΠΎ ΠΎΠ±Π΅ Π½Π΅ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ, Ρ‚ΠΎΠ³Π΄Π° Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ ΠΈΠΌΠ΅Π½. Класс D Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚Π²Π΅Ρ€Π³Π½ΡƒΡ‚, ΠΊΠ°ΠΊ Π½Π°Ρ€ΡƒΡˆΠ°ΡŽΡ‰ΠΈΠΉ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ.

НСрСдко (3) ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ: создана Π½Π΅ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½ΠΎΡΡ‚ΡŒ ΠΈΠΌΠ΅Π½, ΠΈ Π΅Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ. Π’Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΌ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ являСтся ΠΏΠ΅Ρ€Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ², Π½ΠΎ Ρ‚ΠΎΠ³Π΄Π° ΠΌΡ‹ ΠΎΡ‚ рассматриваСмого случая совмСстного использования ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ ΠΊ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ, ΠΈΠ·ΡƒΡ‡Π°Π΅ΠΌΠΎΠΉ Π½ΠΈΠΆΠ΅.

Π•ΡΡ‚ΡŒ ΠΈ другая, Π±ΠΎΠ»Π΅Π΅ изощрСнная Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Π° (3). Она состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ΡŒ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΈΠ· Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² "Π²Π·ΡΡ‚ΡŒ Π²Π΅Ρ€Ρ…" Π½Π°Π΄ Π΄Ρ€ΡƒΠ³ΠΈΠΌ. Π”Π°Π»ΡŒΠ½Π΅ΠΉΡˆΠ΅Π΅ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ - свСсти эту ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ ΠΊ (1), сдСлав ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π΄Π²ΡƒΡ… Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² ΠΎΡ‚Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΌ.

ΠŸΡ€Π°Π²ΠΈΠ»Π° пСрСопрСдСлСния Π΄Π°ΡŽΡ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ f ΠΊΠ°ΠΊ ΠΎΡ‚Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΉ, хотя для этого ΠΈ потрСбуСтся ввСсти ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹ΠΉ класс, скаТСм C', - наслСдника C, СдинствСнная Ρ€ΠΎΠ»ΡŒ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ - Π² ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ ΠΎΡ‚Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ f . Π—Π°Ρ‚Π΅ΠΌ класс D Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π΅Π½ Π½Π΅ ΠΎΡ‚ C, Π° ΠΎΡ‚ C'. Π‘Π»ΠΎΠΆΠ½ΠΎ ΠΈ нСкрасиво. ВмСсто этого Π½Π°ΠΌ Π½ΡƒΠΆΠ΅Π½ простой языковой ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ: undefine. Π’ сСкции наслСдования класса ΠΎΠ½ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ появлСнию Π½ΠΎΠ²ΠΎΠ³ΠΎ прСдлоТСния:


class D inherit

B

C

undefine f end

feature

...

end



БинтаксичСски ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ undefine слСдуСт Π·Π° rename (всякая ΠΎΡ‚ΠΌΠ΅Π½Π° опрСдСлСния Π΄ΠΎΠ»ΠΆΠ½Π° Π΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π½Π° ΠΎΠΊΠΎΠ½Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ ΠΈΠΌΠ΅Π½ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°), Π½ΠΎ Π΄ΠΎ redefine (ΠΏΡ€Π΅ΠΆΠ΄Π΅, Ρ‡Π΅ΠΌ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ, ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠΎΠ·Π°Π±ΠΎΡ‚ΠΈΡ‚ΡŒΡΡ ΠΎΠ± ΠΎΡ‚ΠΌΠ΅Π½Π΅ Π½Π΅Π½ΡƒΠΆΠ½Ρ‹Ρ… ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΉ).

ΠŸΡ€ΠΈΠ·Π½Π°ΠΊΠΎΠΌ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅ΠΌΡ‹ΠΉ языковой ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ ΠΆΠ΅Π»Π°Ρ‚Π΅Π»Π΅Π½, ΠΏΠΎΡ‡Ρ‚ΠΈ всСгда являСтся Π΅Π³ΠΎ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½Π½ΠΎΡΡ‚ΡŒ Π½Π° Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ (соотвСтствСнно, ΠΏΠ»ΠΎΡ…ΠΎΠΉ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ создаСт большС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, Ρ‡Π΅ΠΌ Ρ€Π΅ΡˆΠ°Π΅Ρ‚). ΠœΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ ΠΎΡ‚ΠΌΠ΅Π½Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΉ ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ этому Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΡŽ: ΠΎΠ½ позволяСт ΡΠΎΠ΅Π΄ΠΈΠ½ΡΡ‚ΡŒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ Π² условиях мноТСствСнного (Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ - Π΄ΡƒΠ±Π»ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ³ΠΎ) наслСдования. ΠŸΡƒΡΡ‚ΡŒ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ свСсти Π²ΠΎΠ΅Π΄ΠΈΠ½ΠΎ Π΄Π²Π΅ абстракции:

Рис. 15.22.  Π”Π²Π° родитСля ΠΈ слияниС ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ²

ΠœΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ D Ρ‚Ρ€Π°ΠΊΡ‚ΠΎΠ²Π°Π» f ΠΈ g ΠΊΠ°ΠΊ ΠΎΠ΄ΠΈΠ½ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚. ΠžΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, это Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ лишь ΠΏΡ€ΠΈ условии совмСстимости сСмантики ΠΈ сигнатур ΠΎΠ±ΠΎΠΈΡ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² (числа ΠΈ Ρ‚ΠΈΠΏΠΎΠ² Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°, Ссли ΠΎΠ½ Π΅ΡΡ‚ΡŒ). Допустим, Ρ‡Ρ‚ΠΎ ΠΈΠΌΠ΅Π½Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹, ΠΈ ΠΌΡ‹ Ρ…ΠΎΡ‚Π΅Π»ΠΈ Π±Ρ‹ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ имя f. Π”ΠΎΠ±ΠΈΡ‚ΡŒΡΡ ΠΆΠ΅Π»Π°Π΅ΠΌΠΎΠ³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ, объСдинив ΠΏΠ΅Ρ€Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠ΅ с ΠΎΡ‚ΠΌΠ΅Π½ΠΎΠΉ опрСдСлСния:


class D inherit

B

C

rename

g as f

undefine

f

end

feature

...

end



B ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ» ΠΏΠΎΠ»Π½ΠΎΠ΅ прСвосходство Π½Π°Π΄ C, пСрСдавая классу D ΠΊΠ°ΠΊ сам ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚, Ρ‚Π°ΠΊ ΠΈ Π΅Π³ΠΎ имя. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ сочСтания: ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΎΡ‚ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»Π΅ΠΉ, имя - ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ; ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°, присвоив ΠΈΠΌ Π½ΠΎΠ²ΠΎΠ΅ имя Π² D.

Π•Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½, Π±ΠΎΠ»Π΅Π΅ "симмСтричный" Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ соСдинСния ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ², Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Π·Π°ΠΌΠ΅Π½Π΅ ΠΎΠ±ΠΎΠΈΡ… унаслСдованных Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² Π½Π° Π½ΠΎΠ²Ρ‹ΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚. Достаточно ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΎΠ±Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° Π² ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠΈ redefine, ΡƒΠ±Π΅Π΄ΠΈΠ²ΡˆΠΈΡΡŒ ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ±Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° ΠΈΠΌΠ΅ΡŽΡ‚ ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅ Ρ„ΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠ΅ имя (Π΄ΠΎΠ±Π°Π²ΠΈΠ², Ссли Π½Π°Π΄ΠΎ, Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ rename). Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Π° ΠΈΠΌΠ΅Π½ Π½Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ½Π΅Ρ‚ (случай (2)), Π° объСдинСниС Π΄Π²ΡƒΡ… Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² даст Π½ΠΎΠ²Ρ‹ΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚.

ΠšΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Ρ‹ ΠΏΡ€ΠΈ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ: Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅

Рассмотрим Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ случай ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΠΎΠ² ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΉ, связанных с Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠ΅ΠΉ. ΠŸΡƒΡΡ‚ΡŒ ΠΏΡ€ΠΈ Π΄ΡƒΠ±Π»ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠΌ наслСдовании происходит ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΈ ΠΏΠ΅Ρ€Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠ΅ эффСктивного ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΈΠΌΠ΅Π΅ΠΌ Π΄Π²Π° эффСктивных ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°, Π½Π°Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… собствСнными ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ.

Рис. 15.23.  ΠΠ΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ выдСлСния

ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½Π½Ρ‹ΠΉ Π½Π° рисункС класс B мСняСт имя f Π½Π° bf ΠΈ пСрСопрСдСляСт сам ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚. ΠŸΡ€ΠΈ этом ΠΌΡ‹ ΠΎΠΏΡΡ‚ΡŒ ΠΏΠΎΠ»Π°Π³Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ C Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ мСняСт f, ΠΈΠ½ΠΎΠ΅ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ нисколько Π½Π΅ повлияСт Π½Π° Ρ…ΠΎΠ΄ нашСго рассуТдСния. Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ остался Π±Ρ‹ ΠΏΡ€Π΅ΠΆΠ½ΠΈΠΌ, Ссли Π±Ρ‹ B пСрСопрСдСлял ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ f Π±Π΅Π· Π΅Π³ΠΎ пСрСимСнования, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ ΠΎΡ‚Π»ΠΎΠΆΠΈΡ‚ΡŒ Π΄ΠΎ описания D. Допустим Ρ‚Π°ΠΊΠΆΠ΅, Ρ‡Ρ‚ΠΎ Ρ€Π΅Ρ‡ΡŒ Π½Π΅ ΠΈΠ΄Π΅Ρ‚ ΠΎ соСдинСнии ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² (ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ происходит ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ ΠΎΠ±ΠΎΠΈΡ… ΠΈΠ»ΠΈ ΠΎΡ‚ΠΌΠ΅Π½Π΅ опрСдСлСния ΠΎΠ΄Π½ΠΎΠ³ΠΎ).

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ Π½Π°ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ΡΡ ΠΏΠΎΠ΄ Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ, Ρ‚ΠΎ происходит ΠΈΡ… рСпликация. Класс D ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΠΏΠ°Ρ€Ρƒ нСзависимых ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅, Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… случаСв Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ, Π½Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ копиями ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°.

Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ случая совмСстного использования Π½Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Π° ΠΈΠΌΠ΅Π½. Однако Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Ρ‹, относящиСся ΠΊ динамичСскому ΡΠ²ΡΠ·Ρ‹Π²Π°Π½ΠΈΡŽ. ΠŸΡƒΡΡ‚ΡŒ полиморфная ΡΡƒΡ‰Π½ΠΎΡΡ‚ΡŒ a1 Ρ‚ΠΈΠΏΠ° A (ΠΎΠ±Ρ‰ΠΈΠΉ ΠΏΡ€Π΅Π΄ΠΎΠΊ) Π½Π° этапС выполнСния связываСтся с экзСмпляром Ρ‚ΠΈΠΏΠ° D (ΠΎΠ±Ρ‰ΠΈΠΌ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠΌ). Π§Ρ‚ΠΎ Ρ‚ΠΎΠ³Π΄Π° ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Π²Ρ‹Π·ΠΎΠ² a1.f?

ΠŸΡ€Π°Π²ΠΈΠ»ΠΎ динамичСского связывания гласит: Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ f выбираСтся с ΡƒΡ‡Π΅Ρ‚ΠΎΠΌ Ρ‚ΠΈΠΏΠ° Ρ†Π΅Π»ΠΈ - ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° D. Но Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ это Π²ΠΏΠ΅Ρ€Π²Ρ‹Π΅ нСльзя ΠΈΡΡ‚ΠΎΠ»ΠΊΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½ΠΎ: D содСрТит Π΄Π²Π° Ρ€Π°Π²Π½ΠΎΡ†Π΅Π½Π½Ρ‹Ρ… Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π°, извСстных ΠΏΠΎΠ΄ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ f ΠΈ bf, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»Ρƒ f класса A.

Как ΠΈ ΠΏΡ€ΠΈ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Π΅ ΠΈΠΌΠ΅Π½, нСльзя ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡ‚ΡŒ компилятору Π΄Π΅Π»Π°Ρ‚ΡŒ Π²Ρ‹Π±ΠΎΡ€, ΠΏΠΎΠ»ΡŒΠ·ΡƒΡΡΡŒ собствСнными ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌΠΈ, - это ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΡ€Π΅Ρ‡ΠΈΠ»ΠΎ Π±Ρ‹ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ°ΠΌ ясности ΠΈ надСТности. Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ситуациСй Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΎΡΡ‚Π°Π²Π°Ρ‚ΡŒΡΡ Π·Π° Π°Π²Ρ‚ΠΎΡ€ΠΎΠΌ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ.

Для устранСния нСоднозначности Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ простой языковой ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ - ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ select. Π’ΠΎΡ‚ вСрсия класса, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈ динамичСском связывании сущности f Ρ‚ΠΈΠΏΠ° A отдаСтся вСрсии класса C:


class D inherit

B

C