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

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

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

ΠŸΡ€ΠΈ ΠΊΠΎΠ½Ρ‚Ρ€Π°Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π½ΠΎΠΌ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΈ этих ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ Π½Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π»ΠΎ Π±Ρ‹: спСциализация Ρ†Π΅Π»ΠΈ Π²Ρ‹Π·ΠΎΠ²Π° (Π² нашСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ s) Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π»Π° Π±Ρ‹ обобщСния Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°. ΠšΠΎΠ½Ρ‚Ρ€Π°Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π½ΠΎΡΡ‚ΡŒ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π²Π΅Π΄Π΅Ρ‚ ΠΊ Π±ΠΎΠ»Π΅Π΅ простой матСматичСской ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ°: наслСдованиС - ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ - ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌ. Π”Π°Π½Π½Ρ‹ΠΉ Ρ„Π°ΠΊΡ‚ описан Π² рядС тСорСтичСских статСй, ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΡŽΡ‰ΠΈΡ… эту ΡΡ‚Ρ€Π°Ρ‚Π΅Π³ΠΈΡŽ. АргумСнтация Π½Π΅ слишком ΡƒΠ±Π΅Π΄ΠΈΡ‚Π΅Π»ΡŒΠ½Π°, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ наши ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ, ΠΊΠΎΠ½Ρ‚Ρ€Π°Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π½ΠΎΡΡ‚ΡŒ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ практичСского использования.

Π’ Π»ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΡƒΡ€Π΅ для программистов Π½Π΅Ρ€Π΅Π΄ΠΊΠΎ встрСчаСтся ΠΏΡ€ΠΈΠ·Ρ‹Π² ΠΊ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌ, основанных Π½Π° простых матСматичСских модСлях. Однако матСматичСская красота - всСго лишь ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΊΡ€ΠΈΡ‚Π΅Ρ€ΠΈΠ΅Π² цСнности Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°, - Π΅ΡΡ‚ΡŒ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ - ΠΏΠΎΠ»Π΅Π·Π½ΠΎΡΡ‚ΡŒ ΠΈ Ρ€Π΅Π°Π»ΠΈΡΡ‚ΠΈΡ‡Π½ΠΎΡΡ‚ΡŒ.

ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ, Π½Π΅ ΠΏΡ‹Ρ‚Π°ΡΡΡŒ Π½Π°Ρ‚ΡΠ½ΡƒΡ‚ΡŒ ΠΊΠΎΠ½Ρ‚Ρ€Π°Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π½ΡƒΡŽ ΠΎΠ΄Π΅ΠΆΠ΄Ρƒ Π½Π° ΠΊΠΎΠ²Π°Ρ€ΠΈΠ°Π½Ρ‚Π½ΠΎΠ΅ Ρ‚Π΅Π»ΠΎ, слСдуСт ΠΏΡ€ΠΈΠ½ΡΡ‚ΡŒ ΠΊΠΎΠ²Π°Ρ€ΠΈΠ°Π½Ρ‚Π½ΡƒΡŽ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΈ ΠΈΡΠΊΠ°Ρ‚ΡŒ ΠΏΡƒΡ‚ΠΈ устранСния Π½Π΅ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ эффСкта.

Π‘ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠΌ

ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΈΡΠΊΠ°Ρ‚ΡŒ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ковариантности, рассмотрим Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ, способный Π² условиях ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌΠ° привСсти ΠΊ Π½Π°Ρ€ΡƒΡˆΠ΅Π½ΠΈΡΠΌ Ρ‚ΠΈΠΏΠ°. Π‘ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠΌ (descendant hiding) - это ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ‚ΡŒ класса Π½Π΅ ΡΠΊΡΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ ΠΎΡ‚ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»Π΅ΠΉ.

Рис. 17.8.  Π‘ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠΌ

Π’ΠΈΠΏΠΈΡ‡Π½Ρ‹ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ являСтся ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ add_vertex (Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π²Π΅Ρ€ΡˆΠΈΠ½Ρƒ), экспортируСмый классом POLYGON, Π½ΠΎ скрываСмый Π΅Π³ΠΎ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠΌ RECTANGLE (Π²Π²ΠΈΠ΄Ρƒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠ³ΠΎ Π½Π°Ρ€ΡƒΡˆΠ΅Π½ΠΈΡ ΠΈΠ½Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° - класс Ρ…ΠΎΡ‡Π΅Ρ‚ ΠΎΡΡ‚Π°Π²Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΎΠΌ):


class RECTANGLE inherit

POLYGON

export {NONE} add_vertex end

feature

...

invariant

vertex_count = 4

end



НС программистский ΠΏΡ€ΠΈΠΌΠ΅Ρ€: класс "Бтраус" скрываСт ΠΌΠ΅Ρ‚ΠΎΠ΄ "Π›Π΅Ρ‚Π°Ρ‚ΡŒ", ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ ΠΎΡ‚ родитСля "ΠŸΡ‚ΠΈΡ†Π°".

Π”Π°Π²Π°ΠΉΡ‚Π΅ Π½Π° ΠΌΠΈΠ½ΡƒΡ‚Ρƒ ΠΏΡ€ΠΈΠΌΠ΅ΠΌ эту схСму Ρ‚Π°ΠΊΠΎΠΉ, ΠΊΠ°ΠΊ ΠΎΠ½Π° Π΅ΡΡ‚ΡŒ, ΠΈ поставим вопрос, Π±ΡƒΠ΄Π΅Ρ‚ Π»ΠΈ Π»Π΅Π³ΠΈΡ‚ΠΈΠΌΠ½Ρ‹ΠΌ сочСтаниС наслСдования ΠΈ скрытия. ΠœΠΎΠ΄Π΅Π»ΠΈΡ€ΡƒΡŽΡ‰Π°Ρ Ρ€ΠΎΠ»ΡŒ скрытия, ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ ковариантности, Π½Π°Ρ€ΡƒΡˆΠ°Π΅Ρ‚ΡΡ ΠΈΠ·-Π·Π° Ρ‚Ρ€ΡŽΠΊΠΎΠ², Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… ΠΈΠ·-Π·Π° ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌΠ°. И здСсь Π½Π΅ Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ ΠΏΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ врСдоносный ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΉ, нСсмотря Π½Π° скрытиС ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°, Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Π΅Π³ΠΎ ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΡƒ Π²Π΅Ρ€ΡˆΠΈΠ½Ρƒ:


p: POLYGON; r: RECTANGLE

...

create r; -- Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° RECTANGLE.

p := r; -- ΠŸΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„Π½ΠΎΠ΅ присваиваниС.

p.add_vertex (...)



Π’Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ r скрываСтся ΠΏΠΎΠ΄ ΡΡƒΡ‰Π½ΠΎΡΡ‚ΡŒΡŽ p класса POLYGON, Π° add_vertex экспортируСмый ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ POLYGON, Ρ‚ΠΎ Π΅Π³ΠΎ Π²Ρ‹Π·ΠΎΠ² ΡΡƒΡ‰Π½ΠΎΡΡ‚ΡŒΡŽ p ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π΅Π½. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ выполнСния Π² ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ΅ появится Π΅Ρ‰Π΅ ΠΎΠ΄Π½Π° Π²Π΅Ρ€ΡˆΠΈΠ½Π°, Π° Π·Π½Π°Ρ‡ΠΈΡ‚, Π±ΡƒΠ΄Π΅Ρ‚ создан нСдопустимый ΠΎΠ±ΡŠΠ΅ΠΊΡ‚.

ΠšΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΡΡ‚ΡŒ систСм ΠΈ классов

Для обсуТдСния ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ ковариантности ΠΈ скрытия ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠΌ Π½Π°ΠΌ понадобится нСсколько Π½ΠΎΠ²Ρ‹Ρ… Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΎΠ². Π‘ΡƒΠ΄Π΅ΠΌ Π½Π°Π·Ρ‹Π²Π°Ρ‚ΡŒ классово-ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠΉ (class-valid) систСму, ΡƒΠ΄ΠΎΠ²Π»Π΅Ρ‚Π²ΠΎΡ€ΡΡŽΡ‰ΡƒΡŽ Ρ‚Ρ€Π΅ΠΌ ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌ описания Ρ‚ΠΈΠΏΠΎΠ², ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΌ Π² Π½Π°Ρ‡Π°Π»Π΅ Π»Π΅ΠΊΡ†ΠΈΠΈ. Напомним ΠΈΡ…: каТдая ΡΡƒΡ‰Π½ΠΎΡΡ‚ΡŒ ΠΈΠΌΠ΅Π΅Ρ‚ свой Ρ‚ΠΈΠΏ; Ρ‚ΠΈΠΏ фактичСского Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ совмСстимым с Ρ‚ΠΈΠΏΠΎΠΌ Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ, аналогичная ситуация с присваиваниСм; Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ объявлСн Π² своСм классС ΠΈ экспортирован классу, содСрТащСму Π²Ρ‹Π·ΠΎΠ².

БистСма называСтся систСмно-ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠΉ (system-valid), Ссли ΠΏΡ€ΠΈ Π΅Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ Π½Π΅ происходит Π½Π°Ρ€ΡƒΡˆΠ΅Π½ΠΈΡ Ρ‚ΠΈΠΏΠΎΠ².

Π’ ΠΈΠ΄Π΅Π°Π»Π΅ ΠΎΠ±Π° понятия Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠΎΠ²ΠΏΠ°Π΄Π°Ρ‚ΡŒ. Однако ΠΌΡ‹ ΡƒΠΆΠ΅ Π²ΠΈΠ΄Π΅Π»ΠΈ, Ρ‡Ρ‚ΠΎ классово-коррСктная систСма Π² условиях наслСдования, ковариантности ΠΈ скрытия ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π΅ Π±Ρ‹Ρ‚ΡŒ систСмно-ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠΉ. НазовСм Ρ‚Π°ΠΊΡƒΡŽ ΠΎΡˆΠΈΠ±ΠΊΡƒ Π½Π°Ρ€ΡƒΡˆΠ΅Π½ΠΈΠ΅ΠΌ систСмной коррСктности (system validity error).

ΠŸΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΠΈΠΉ аспСкт

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

Однако это Π½Π΅ позволяСт ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ…, Π° ΠΏΠΎΡ‚ΠΎΠΌΡƒ ΠΌΡ‹ приступаСм ΠΊ ΠΈΠ·ΡƒΡ‡Π΅Π½ΠΈΡŽ Ρ‚Ρ€Π΅Ρ… Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… ΠΏΡƒΡ‚Π΅ΠΉ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π΄Π°Π½Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹.

Π”Π°Π»Π΅Π΅ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ Π·Π°Ρ‚Ρ€Π°Π³ΠΈΠ²Π°Ρ‚ΡŒ вСсьма Ρ‚ΠΎΠ½ΠΊΠΈΠ΅ ΠΈ Π½Π΅ ΡΡ‚ΠΎΠ»ΡŒ часто Π΄Π°ΡŽΡ‰ΠΈΠ΅ ΠΎ сСбС Π·Π½Π°Ρ‚ΡŒ аспСкты ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π°. Читая ΠΊΠ½ΠΈΠ³Ρƒ Π²ΠΏΠ΅Ρ€Π²Ρ‹Π΅, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΎΡΡ‚Π°Π²ΡˆΠΈΠ΅ΡΡ Ρ€Π°Π·Π΄Π΅Π»Ρ‹ этой Π»Π΅ΠΊΡ†ΠΈΠΈ. Если Π²Ρ‹ лишь Π½Π΅Π΄Π°Π²Π½ΠΎ занялись вопросами ОО-Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ, Ρ‚ΠΎ Π»ΡƒΡ‡ΡˆΠ΅ усвоитС этот ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π» послС изучСния Π»Π΅ΠΊΡ†ΠΈΠΉ 1-11 курса "ΠžΡΠ½ΠΎΠ²Ρ‹ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ проСктирования", посвящСнной ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ»ΠΎΠ³ΠΈΠΈ наслСдования, ΠΈ Π² особСнности Π»Π΅ΠΊΡ†ΠΈΠΈ 6 курса "ΠžΡΠ½ΠΎΠ²Ρ‹ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ проСктирования", посвящСнной ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ»ΠΎΠ³ΠΈΠΈ наслСдования.

ΠšΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΡΡ‚ΡŒ систСм: ΠΏΠ΅Ρ€Π²ΠΎΠ΅ ΠΏΡ€ΠΈΠ±Π»ΠΈΠΆΠ΅Π½ΠΈΠ΅

Π”Π°Π²Π°ΠΉΡ‚Π΅ сконцСнтрируСмся Π²Π½Π°Ρ‡Π°Π»Π΅ Π½Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ΅ ковариантности, Π±ΠΎΠ»Π΅Π΅ Π²Π°ΠΆΠ½ΠΎΠΉ ΠΈΠ· Π΄Π²ΡƒΡ… рассматриваСмых. Π­Ρ‚ΠΎΠΉ Ρ‚Π΅ΠΌΠ΅ посвящСна ΠΎΠ±ΡˆΠΈΡ€Π½Π°Ρ Π»ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΡƒΡ€Π°, ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΡŽΡ‰Π°Ρ ряд Ρ€Π°Π·Π½ΠΎΠΎΠ±Ρ€Π°Π·Π½Ρ‹Ρ… Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ.

ΠšΠΎΠ½Ρ‚Ρ€Π°Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π½ΠΎΡΡ‚ΡŒ ΠΈ Π±Π΅Π·Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π½ΠΎΡΡ‚ΡŒ

ΠšΠΎΠ½Ρ‚Ρ€Π°Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π½ΠΎΡΡ‚ΡŒ устраняСт тСорСтичСскиС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, связанныС с Π½Π°Ρ€ΡƒΡˆΠ΅Π½ΠΈΠ΅ΠΌ систСмной коррСктности. Однако ΠΏΡ€ΠΈ этом тСряСтся Ρ€Π΅Π°Π»ΠΈΡΡ‚ΠΈΡ‡Π½ΠΎΡΡ‚ΡŒ систСмы Ρ‚ΠΈΠΏΠΎΠ², ΠΏΠΎ этой ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ этот ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ Π² дальнСйшСм Π½Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ нСобходимости.

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

ИспользованиС Ρ€ΠΎΠ΄ΠΎΠ²Ρ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²

Π£Π½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π»Π΅ΠΆΠΈΡ‚ Π² основС интСрСсной ΠΈΠ΄Π΅ΠΈ, Π²ΠΏΠ΅Ρ€Π²Ρ‹Π΅ высказанной Π€Ρ€Π°Π½Ρ†Π΅ΠΌ Π’Π΅Π±Π΅Ρ€ΠΎΠΌ (Franz Weber). Объявим класс SKIER1, ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ² ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Ρ€ΠΎΠ΄ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° классом ROOM:


class SKIER1 [G -> ROOM] feature

accommodation: G

accommodate (r: G) is ... require ... do accommodation := r end

end



Π’ΠΎΠ³Π΄Π° класс GIRL1 Π±ΡƒΠ΄Π΅Ρ‚ наслСдником SKIER1 [GIRL_ROOM] ΠΈ Ρ‚. Π΄. Π’Π΅ΠΌ ΠΆΠ΅ ΠΏΡ€ΠΈΠ΅ΠΌΠΎΠΌ, ΠΊΠ°ΠΊΠΈΠΌ Π±Ρ‹ странным ΠΎΠ½ Π½Π΅ казался Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ взгляд, ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΈ ΠΏΡ€ΠΈ отсутствии ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠΈ: class SKIER [G -> SKIER].

Π­Ρ‚ΠΎΡ‚ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ позволяСт Ρ€Π΅ΡˆΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ ковариантности. ΠŸΡ€ΠΈ любом использовании класса Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π·Π°Π΄Π°Ρ‚ΡŒ фактичСский Ρ€ΠΎΠ΄ΠΎΠ²ΠΎΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ROOM ΠΈΠ»ΠΈ GIRL_ROOM, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ нСвСрная комбинация просто становится Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠΉ. Π―Π·Ρ‹ΠΊ становится Π±Π΅Π·Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π½Ρ‹ΠΌ, Π° систСма ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ потрСбностям ковариантности благодаря Ρ€ΠΎΠ΄ΠΎΠ²Ρ‹ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌ.

К соТалСнию, эта Ρ‚Π΅Ρ…Π½ΠΈΠΊΠ° Π½Π΅ΠΏΡ€ΠΈΠ΅ΠΌΠ»Π΅ΠΌΠ° ΠΊΠ°ΠΊ ΠΎΠ±Ρ‰Π΅Π΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π²Π΅Π΄Π΅Ρ‚ ΠΊ Ρ€Π°Π·Ρ€Π°ΡΡ‚Π°Π½ΠΈΡŽ списка Ρ€ΠΎΠ΄ΠΎΠ²Ρ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ Π½Π° ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ‚ΠΈΠΏ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ²Π°Ρ€ΠΈΠ°Π½Ρ‚Π½ΠΎΠ³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°. Π₯ΡƒΠΆΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ²Π°Ρ€ΠΈΠ°Π½Ρ‚Π½ΠΎΠΉ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ с Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ, Ρ‚ΠΈΠΏ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ отсутствуСт Π² спискС, ΠΏΠΎΡ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ добавлСния Ρ€ΠΎΠ΄ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° класса, Π°, ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ интСрфСйс класса, ΠΏΠΎΠ²Π»Π΅Ρ‡Π΅Ρ‚ измСнСния Ρƒ всСх ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ² класса, Ρ‡Ρ‚ΠΎ нСдопустимо.

Π’ΠΈΠΏΠΎΠ²Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅

Ряд Π°Π²Ρ‚ΠΎΡ€ΠΎΠ², срСди ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Ким Π‘Ρ€ΡŽΡ (Kim Bruce), Дэвид Π¨Π΅Π½Π³ (David Shang) ΠΈ Π’ΠΎΠ½ΠΈ Баймонс (Tony Simons), ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈΠ»ΠΈ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π½Π° основС Ρ‚ΠΈΠΏΠΎΠ²Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… (type variables), значСниями ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ‚ΠΈΠΏΡ‹. Π˜Ρ… идСя проста:

[x]. Π²Π·Π°ΠΌΠ΅Π½ ΠΊΠΎΠ²Π°Ρ€ΠΈΠ°Π½Ρ‚Π½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΉ Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡŒ объявлСниС Ρ‚ΠΈΠΏΠΎΠ², ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π΅Π΅ Ρ‚ΠΈΠΏΠΎΠ²Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅;

[x]. Ρ€Π°ΡΡˆΠΈΡ€ΠΈΡ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»Π° совмСстимости Ρ‚ΠΈΠΏΠΎΠ² для управлСния Ρ‚Π°ΠΊΠΈΠΌΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ;

[x]. ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ язык (Π² ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠΌ) Π±Π΅Π·Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π½Ρ‹ΠΌ;

[x]. ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ присваивания Ρ‚ΠΈΠΏΠΎΠ²Ρ‹ΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ Π² качСствС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Ρ‚ΠΈΠΏΡ‹ языка.

ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠ΅ ΠΈΠ·Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ этих ΠΈΠ΄Π΅ΠΉ Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π½Π°ΠΉΡ‚ΠΈ Π² рядС статСй ΠΏΠΎ Π΄Π°Π½Π½ΠΎΠΉ Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΠΊΠ΅, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π² публикациях ΠšΠ°Ρ€Π΄Π΅Π»Π»ΠΈ (Cardelli), ΠšΠ°ΡΡ‚Π°Π½ΡŒΠΈ (Castagna), Π’Π΅Π±Π΅Ρ€Π° (Weber) ΠΈ Π΄Ρ€. ΠΠ°Ρ‡Π°Ρ‚ΡŒ ΠΈΠ·ΡƒΡ‡Π΅Π½ΠΈΠ΅ вопроса ΠΌΠΎΠΆΠ½ΠΎ с источников, ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Ρ… Π² библиографичСских Π·Π°ΠΌΠ΅Ρ‚ΠΊΠ°Ρ… ΠΊ этой Π»Π΅ΠΊΡ†ΠΈΠΈ. ΠœΡ‹ ΠΆΠ΅ Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ Π·Π°Π½ΠΈΠΌΠ°Ρ‚ΡŒΡΡ этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ, ΠΈ Π²ΠΎΡ‚ ΠΏΠΎΡ‡Π΅ΠΌΡƒ.

[x]. НадлСТащС Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Ρ‚ΠΈΠΏΠΎΠ²Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… относится ΠΊ ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π΅ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏ Π±Π΅Π· ΠΏΠΎΠ»Π½ΠΎΠΉ Π΅Π³ΠΎ спСцификации. Π­Ρ‚Π° ΠΆΠ΅ катСгория Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΈ Π·Π°ΠΊΡ€Π΅ΠΏΠ»Π΅Π½ΠΈΠ΅ объявлСний. Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ ΠΌΠΎΠ³ Π±Ρ‹ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡ‹ этой ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ. Π’Π½Π°Ρ‡Π°Π»Π΅ это ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΡ‚ΠΎΠ»ΠΊΠΎΠ²Π°Ρ‚ΡŒ Π² ΠΏΠΎΠ»ΡŒΠ·Ρƒ Ρ‚ΠΈΠΏΠΎΠ²Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, Π½ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΠΏΠ»Π°Ρ‡Π΅Π²Π½Ρ‹ΠΌ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π½Π΅ ясно, смоТСт Π»ΠΈ этот Π²ΡΠ΅ΠΎΠ±ΡŠΠ΅ΠΌΠ»ΡŽΡ‰ΠΈΠΉ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ ΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒΡΡ со всСми Π·Π°Π΄Π°Ρ‡Π°ΠΌΠΈ с Ρ‚ΠΎΠΉ Π»Π΅Π³ΠΊΠΎΡΡ‚ΡŒΡŽ ΠΈ простотой, которая присуща ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΈ Π·Π°ΠΊΡ€Π΅ΠΏΠ»Π΅Π½ΠΈΡŽ Ρ‚ΠΈΠΏΠΎΠ².