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

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

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

Π—Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ особых случаСв, Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰ΠΈΡ… ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅, рСпликация ΠΌΠΎΠΆΠ΅Ρ‚ Π½ΠΎΡΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€: фактичСского дублирования ΠΊΠΎΠ΄Π° Π½Π΅ происходит, Π½ΠΎ Π΄ΡƒΠ±Π»ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΌΠΎΠΊ ΠΈΠΌΠ΅Π΅Ρ‚ доступ ΠΊ Π΄Π²ΡƒΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌ.

ΠŸΡ€Π°Π²ΠΈΠ»ΠΎ ΠΏΡ€ΠΈΠ΄Π°Π΅Ρ‚ ΠΆΠ΅Π»Π°Π΅ΠΌΡƒΡŽ Π³ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒ процСссу объСдинСния классов. Π’ΠΎΡ‚ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ класс FRENCH_US_DRIVER:


class FRENCH_US_DRIVER inherit

FRENCH_DRIVER

rename

address as french_address,

violation_count as french_violation_count,

pay_fee as pay_french_fee

end

US_DRIVER

rename

address as us_address,

violation_count as us_violation_count,

pay_fee as pay_us_fee

end

feature

...

end



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

ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ age ΠΈ pass_birthday ΠΏΠ΅Ρ€Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Ρ‹ Π½Π΅ Π±Ρ‹Π»ΠΈ, Π° ΠΏΠΎΡ‚ΠΎΠΌΡƒ, ΠΊΠ°ΠΊ ΠΌΡ‹ ΠΈ Ρ…ΠΎΡ‚Π΅Π»ΠΈ, ΠΎΠ½ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ совмСстно.

Π Π΅ΠΏΠ»ΠΈΡ†ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚, скаТСм, address, Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ экзСмплярС класса FRENCH_US_ DRIVER Π±ΡƒΠ΄Π΅Ρ‚ прСдставлСн нСсколькими полями Π΄Π°Π½Π½Ρ‹Ρ…. Π’ΠΎΠ³Π΄Π° ΠΏΡ€ΠΈ условии, Ρ‡Ρ‚ΠΎ эти классы содСрТат Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Π΅ Π½Π°ΠΌΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹, ΠΈΡ… экзСмпляры Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΠΊΠ°ΠΊ Π½Π° рис. 15.18.

Рис. 15.17.  Π‘овмСстноС использованиС ΠΈ рСпликация

Рис. 15.18.  Π Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ²

(ΠžΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΡ FRENCH_DRIVER ΠΈ US_DRIVER Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Π° ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ DRIVER, см. рисунок.)

ОсобСнно Π²Π°ΠΆΠ½Ρ‹ΠΌ Π² Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ классов являСтся ΡƒΠΌΠ΅Π½ΠΈΠ΅ ΠΈΠ·Π±Π΅Π³Π°Ρ‚ΡŒ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ совмСстно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ², Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ age ΠΈΠ· FRENCH_US_DRIVER. НС имСя достаточно ΠΎΠΏΡ‹Ρ‚Π°, ΠΌΠΎΠΆΠ½ΠΎ Π»Π΅Π³ΠΊΠΎ Π΄ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Ρ‚Π°ΠΊΡƒΡŽ ΠΎΡˆΠΈΠ±ΠΊΡƒ ΠΈ Ρ€Π΅ΠΏΠ»ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ всС поля класса. Π’Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ Π²ΠΏΡƒΡΡ‚ΡƒΡŽ нСдопустимо, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ спуска ΠΏΠΎ ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠΈ "ΠΌΠ΅Ρ€Ρ‚Π²ΠΎΠ΅" пространство Π±ΡƒΠ΄Π΅Ρ‚ лишь Π²ΠΎΠ·Ρ€Π°ΡΡ‚Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ катастрофичСски нСэффСктивному Ρ€Π°ΡΡ…ΠΎΠ΄ΠΎΠ²Π°Π½ΠΈΡŽ рСсурсов. (ΠŸΠΎΠΌΠ½ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ Π²ΠΎ врСмя выполнСния ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ прСдставлСн Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… экзСмплярах класса ΠΈ Π΅Π³ΠΎ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠ².)

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

[x]. Π½ΡƒΠ»Π΅Π²Ρ‹Π΅ Π·Π°Ρ‚Ρ€Π°Ρ‚Ρ‹ Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ;

[x]. Π½ΠΈΠ·ΠΊΠΈΠ΅, ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½Ρ‹Π΅ константой, Π·Π°Ρ‚Ρ€Π°Ρ‚Ρ‹ Π½Π° динамичСскоС связываниС (Π½Π΅ зависящиС ΠΎΡ‚ наличия Π² систСмС Π΄ΡƒΠ±Π»ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ³ΠΎ наслСдования классов).

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ сущСствуСт рСализация, ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‰Π°Ρ этим цСлям, Ρ‚ΠΎ ΠΈ Π² любой систСмС Ρ‚Π΅Ρ…Π½ΠΈΠΊΠ° Π΄ΡƒΠ±Π»ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ³ΠΎ наслСдования Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Π° Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΈΠ·Π΄Π΅Ρ€ΠΆΠ΅ΠΊ.

Π”ΡƒΠ±Π»ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ΅ наслСдованиС Π² Π‘++ слСдуСт Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ ΠΎΠ±Ρ€Π°Π·Ρ†Ρƒ. Π£Ρ€ΠΎΠ²Π΅Π½ΡŒ, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ принимаСтся Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, Ρ€Π°Π·Π΄Π΅Π»ΡΡ‚ΡŒ ΠΈΠ»ΠΈ Π΄ΡƒΠ±Π»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹, - это класс. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΏΡ€ΠΈ нСобходимости дублирования ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°, приходится Π΄ΡƒΠ±Π»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ всС. Π’ Java эта ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° исчСзаСт, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π·Π°ΠΏΡ€Π΅Ρ‰Π΅Π½ΠΎ мноТСствСнноС наслСдованиС.

НСнавязчивоС Π΄ΡƒΠ±Π»ΠΈΡ€ΡƒΡŽΡ‰Π΅Π΅ наслСдованиС

На ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ Π½Π΅ ΡΡ‚ΠΎΠ»ΡŒ часто Π²ΡΡ‚Ρ€Π΅Ρ‡Π°ΡŽΡ‚ΡΡ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹, ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ "ΠΌΠ΅ΠΆΠΊΠΎΠ½Ρ‚ΠΈΠ½Π΅Π½Ρ‚Π°Π»ΡŒΠ½Ρ‹ΠΌ" водитСлям, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π½ΡƒΠΆΠ½Ρ‹ ΠΈ рСпликация ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ², ΠΈ ΠΈΡ… совмСстноС ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅. Они Π½Π΅ для Π½ΠΎΠ²ΠΈΡ‡ΠΊΠΎΠ². Π‘Π»Π΅Π΄ΡƒΠ΅Ρ‚ приобрСсти ΠΎΠΏΡ‹Ρ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π±Ρ€Π°Ρ‚ΡŒΡΡ Π·Π° Π½ΠΈΡ….

Π˜Π½Π°Ρ‡Π΅ Π² ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΄ΡƒΠ±Π»ΠΈΡ€ΡƒΡŽΡ‰Π΅Π΅ наслСдованиС "Π² Π»ΠΎΠ±", ΠΌΠΎΠΆΠ½ΠΎ лишь всС ΡƒΡΠ»ΠΎΠΆΠ½ΠΈΡ‚ΡŒ, ΠΊΠΎΠ³Π΄Π° это ΠΈ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ.

Рис. 15.19.  Π˜Π·Π±Ρ‹Ρ‚ΠΎΡ‡Π½ΠΎΠ΅ наслСдованиС

На рисункС ΠΏΠΎΠΊΠ°Π·Π°Π½Π° типичная ошибка Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΡ… (ΠΈΠ»ΠΈ рассСянных Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ²): класс D объявлСн наслСдником B, Π΅ΠΌΡƒ Π½ΡƒΠΆΠ½Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ свойства класса A, Π½ΠΎ B сам являСтся ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠΌ A. Π—Π°Π±Ρ‹Π² ΠΎ транзитивности наслСдования, Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΏΠΈΡˆΠ΅Ρ‚:


class D ... inherit

B

A

...



Π’ ΠΈΡ‚ΠΎΠ³Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ Π΄ΡƒΠ±Π»ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ΅ наслСдованиС. Π•Π³ΠΎ ΠΈΠ·Π±Ρ‹Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Π°. Π’ΠΏΡ€ΠΎΡ‡Π΅ΠΌ, ΠΏΡ€ΠΈ Π½Π°Π΄Π»Π΅ΠΆΠ°Ρ‰Π΅ΠΌ соблюдСнии принятых соглашСний всС ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ классов (ΠΏΡ€ΠΈ сохранСнии ΠΈΡ… ΠΈΠΌΠ΅Π½) Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ совмСстно, Π½ΠΎΠ²Ρ‹Ρ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² Π½Π΅ появится, ΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΈΠ·Π΄Π΅Ρ€ΠΆΠ΅ΠΊ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚. Π”Π°ΠΆΠ΅ Ссли Π² B Ρ‡Π°ΡΡ‚ΡŒ ΠΈΠΌΠ΅Π½ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² мСняСтся, СдинствСнным слСдствиСм этого станСт лишь Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ расход памяти.

Из этого Π΅ΡΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅: случай, ΠΊΠΎΠ³Π΄Π° B пСрСопрСдСляСт ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² A, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ нСоднозначности Π² D. Но Ρ‚ΠΎΠ³Π΄Π°, ΠΊΠ°ΠΊ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½ΠΈΠΆΠ΅, компилятор выдаст сообщСниС ΠΎΠ± ошибкС, прСдлагая Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Π² D ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π΄Π²ΡƒΡ… Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°.

Π˜Π·Π±Ρ‹Ρ‚ΠΎΡ‡Π½ΠΎΠ΅, хотя ΠΈ Π±Π΅Π·Π²Ρ€Π΅Π΄Π½ΠΎΠ΅ наслСдованиС ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΡ‚ΠΈ, Ссли A - это класс, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΠΈΠΉ ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ B ΠΈ D. Π’ этом случаС достаточно ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ D наслСдником B. Π­Ρ‚ΠΎ автоматичСски Π΄Π΅Π»Π°Π΅Ρ‚ D ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠΌ A, Ρ‡Ρ‚ΠΎ позволяСт ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΠΊΠΎ всСм Π½ΡƒΠΆΠ½Ρ‹ΠΌ функциям. Π˜Π·Π±Ρ‹Ρ‚ΠΎΡ‡Π½ΠΎΠ΅ наслСдованиС Π½Π΅ нанСсСт Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ Π²Ρ€Π΅Π΄Π°, ΠΎΡΡ‚Π°Π²ΡˆΠΈΡΡŒ практичСски Π±Π΅Π· послСдствий.

Π’Π°ΠΊΠΈΠ΅ случаи "Π±Π΅Π·Π²Ρ€Π΅Π΄Π½ΠΎΠ³ΠΎ" наслСдования ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π΅Π½ΠΈΠΈ ΠΎΡ‚ ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹Ρ… классов ANY ΠΈ GENERAL, Ρ€Π΅Ρ‡ΡŒ ΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΏΠΎΠΉΠ΄Π΅Ρ‚ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ Π»Π΅ΠΊΡ†ΠΈΠΈ.

ΠŸΡ€Π°Π²ΠΈΠ»ΠΎ пСрСимСнования

Π’ этом Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠΌΡ‹ Π½Π΅ Π²Π²Π΅Π΄Π΅ΠΌ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… Π½ΠΎΠ²Ρ‹Ρ… понятий, Π° лишь Ρ‚ΠΎΡ‡Π½Π΅Π΅ сформулируСм извСстныС ΠΏΡ€Π°Π²ΠΈΠ»Π° ΠΈ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΡ€ΠΈΠ·Π²Π°Π½Π½Ρ‹ΠΉ ΠΏΠΎΡΡΠ½ΠΈΡ‚ΡŒ сказанноС.

НачнСм с Π·Π°ΠΏΡ€Π΅Ρ‚Π° возникновСния ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Π° ΠΈΠΌΠ΅Π½:

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅: Ρ„ΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠ΅ имя

Π€ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° класса являСтся:

[x]. Для нСпосрСдствСнного ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° (объявлСнного Π² самом классС) - имя, ΠΏΠΎΠ΄ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΎΠ½ объявлСн.

[x]. Для наслСдуСмого ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° Π±Π΅Π· пСрСимСнования - Ρ„ΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠ΅ имя ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° (рСкурсивно) Π² Ρ‚ΠΎΠΌ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠΌ классС, ΠΎΡ‚ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΎΠ½ΠΎ унаслСдовано.

[x]. Для ΠΏΠ΅Ρ€Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° - имя, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠ΅ ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠΈ.

ΠŸΡ€Π°Π²ΠΈΠ»ΠΎ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ

Π Π°Π·Π½Ρ‹Π΅ эффСктивныС ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ ΠΎΠ΄Π½ΠΎΠ³ΠΎ класса Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅ Ρ„ΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠ΅ имя.

ΠšΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ ΠΈΠΌΠ΅Π½ происходит Π² Ρ‚ΠΎΠΌ случаС, ΠΊΠΎΠ³Π΄Π° Π΄Π²Π° Ρ€Π°Π·Π½Ρ‹Ρ… ΠΏΠΎ сути ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°, ΠΎΠ±Π° эффСктивныС (Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹Π΅), ΠΈΠΌΠ΅ΡŽΡ‚ ΠΎΠ΄Π½ΠΎ Ρ„ΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠ΅ имя. Π’Π°ΠΊΠΎΠΉ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ Π΄Π΅Π»Π°Π΅Ρ‚ класс Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΌ, ΠΎΠ΄Π½Π°ΠΊΠΎ ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ Π»Π΅Π³ΠΊΠΎ ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ, Π΄ΠΎΠ±Π°Π²ΠΈΠ² Π½Π°Π΄Π»Π΅ΠΆΠ°Ρ‰Π΅Π΅ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ пСрСимСнования.

ΠšΠ»ΡŽΡ‡Π΅Π²Ρ‹ΠΌ Π² тСкстС ΠΏΡ€Π°Π²ΠΈΠ»Π° являСтся слово "Ρ€Π°Π·Π½Ρ‹Π΅". Если ΠΏΠΎΠ΄ ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ ΠΌΡ‹ наслСдуСм ΠΎΡ‚ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»Π΅ΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² ΠΈΡ… ΠΎΠ±Ρ‰Π΅Π³ΠΎ ΠΏΡ€Π΅Π΄ΠΊΠ°, дСйствуСт ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ совмСстного использования ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ²: наслСдуСтся ΠΎΠ΄ΠΈΠ½ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚, ΠΈ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Π° ΠΈΠΌΠ΅Π½ Π½Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚.

Π—Π°ΠΏΡ€Π΅Ρ‚ Π½Π° Π΄ΡƒΠ±Π»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π½ касаСтся лишь эффСктивных ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ². Если ΠΎΠ΄ΠΈΠ½ ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² с ΠΎΠΌΠΎΠ½ΠΈΠΌΠΈΡ‡Π½Ρ‹ΠΌΠΈ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΎΡ‚Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΌΠΈ, ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ фактичСски ΡΠ»ΠΈΡ‚ΡŒ Π²ΠΎΠ΅Π΄ΠΈΠ½ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ отсутствуСт Π½Π΅ΡΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ. ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΌΡ‹ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠΌ ΠΎΠ± этом Ρ‡ΡƒΡ‚ΡŒ Π½ΠΈΠΆΠ΅.

ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Π΅ ΠΏΡ€Π°Π²ΠΈΠ»Π° просты ΠΈ ΠΈΠ½Ρ‚ΡƒΠΈΡ‚ΠΈΠ²Π½Ρ‹. Π§Ρ‚ΠΎΠ±Ρ‹ Π² послСдний Ρ€Π°Π· Π½Π°ΠΌ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ Π² ΠΈΡ… ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΌ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠΈ, построим простой ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ допустимыС ΠΈ нСдопустимыС Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ наслСдования.

Рис. 15.20.  Π”Π²Π° Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° наслСдования


class A feature

this_one_OK: INTEGER

end

class B inherit A feature

portends_trouble: REAL

end

class C inherit A feature

portends_trouble: CHARACTER

end

class D inherit

-- Π­Ρ‚ΠΎ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚!

B

C

end



Класс D наслСдуСт this_one_OK Π΄Π²Π°ΠΆΠ΄Ρ‹, ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· ΠΎΡ‚ B, Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ€Π°Π· - ΠΎΡ‚ C. ΠšΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Π° ΠΈΠΌΠ΅Π½ Π½Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π΄Π°Π½Π½Ρ‹ΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ совмСстно. На самом Π΄Π΅Π»Π΅, это - ΠΎΠ΄ΠΈΠ½ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ ΠΏΡ€Π΅Π΄ΠΊΠ° A.

Π”Π²Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° portend_trouble ("ΠΏΡ€Π΅Π΄Π²Π΅Ρ‰Π°ΡŽΡ‰ΠΈΠ΅ Π±Π΅Π΄Ρƒ") заслуТСнно ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ Ρ‚Π°ΠΊΠΎΠ΅ имя. Они Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹, ΠΏΠΎΡ‚ΠΎΠΌΡƒ ΠΈΡ… появлСниС Π² D Π²Π΅Π΄Π΅Ρ‚ ΠΊ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Ρƒ ΠΈΠΌΠ΅Π½, дСлая класс Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΌ. (Π£ Π½ΠΈΡ… Ρ€Π°Π·Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹, Π½ΠΎ ΠΈ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ повлияли Π±Ρ‹ Π½Π° Ρ…ΠΎΠ΄ нашСго обсуТдСния.)

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