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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π―Π·Ρ‹ΠΊ программирования PerlΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 40

Автор ΠœΠΈΡ…Π°ΠΈΠ» Π¨ΠΎΡ…ΠΈΡ€Π΅Π²

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ ΠΈ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ, ΠΈΠ·ΡƒΡ‡Π΅Π½Π½Ρ‹Π΅ Π² этой Π»Π΅ΠΊΡ†ΠΈΠΈ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ программисту Ρ€Π°Ρ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ собствСнныС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ΠΈ Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ Ρ€Π°Π·Ρ€Π°ΡΡ‚Π°Ρ‚ΡŒΡΡ Π² объСмС. А ΠΈΠ·ΡƒΡ‡Π΅Π½Π½Ρ‹Π΅ ΠΏΡ€ΠΈΠ΅ΠΌΡ‹ Ρ€Π°Π±ΠΎΡ‚Ρ‹ со стандартными Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°ΠΌΠΈ ΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ модулями ΠΏΠΎΠΌΠΎΠ³ΡƒΡ‚ Ρ€Π°Ρ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ создали, ΠΎΡ‚Π»Π°Π΄ΠΈΠ»ΠΈ ΠΈ протСстировали Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ.

ЛСкция 14. ΠžΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅

ЛСкция посвящСна Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ Π½Π° Perl с использованиСм ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π°. Π­Ρ‚ΠΎ общСпринятая соврСмСнная тСхнология программирования, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π°Ρ Π±ΠΎΡ€ΠΎΡ‚ΡŒΡΡ со ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ создаваСмых ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ ΠΏΡƒΡ‚Π΅ΠΌ классификации ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΈ модСлирования ΠΈΡ… повСдСния.

ЦСль Π»Π΅ΠΊΡ†ΠΈΠΈ: Π½Π°ΡƒΡ‡ΠΈΡ‚ΡŒΡΡ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π° Perl с ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎΠ³ΠΎ программирования. ΠžΡΠ²ΠΎΠΈΡ‚ΡŒ способы описания классов ΠΈ ΠΏΡ€ΠΈΠ΅ΠΌΡ‹ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ свойства ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ классов.

ВСхнология ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ программирования прСдставляСт ΠΈΠ· сСбя соврСмСнный ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΊ созданию ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… систСм, основанный Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΌΠΎΠ΄Π΅Π»ΠΈΡ€ΡƒΡŽΡ‰ΠΈΡ… состояниС ΠΈ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… сущностСй. НС ΡƒΠ³Π»ΡƒΠ±Π»ΡΡΡΡŒ Π² Ρ‚Π΅ΠΎΡ€ΠΈΡŽ, ΠΌΠΎΠΆΠ½ΠΎ Π΄Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΈΠ΅ Π½Π΅Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Ρ‹Π΅ опрСдСлСния основным Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°ΠΌ, примСняСмым Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ:

[x]. Класс (class) - это ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΠΎΠ΅ описаниС для ΠΎΠ΄Π½ΠΎΡ‚ΠΈΠΏΠ½Ρ‹Ρ… сущностСй ΠΈΡ… Π½Π΅ΠΎΡ‚ΡŠΠ΅ΠΌΠ»Π΅ΠΌΡ‹Ρ… характСристик (Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ²) ΠΈ ΠΈΡ… повСдСния (ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ²). ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ классов: "Π›ΠΈΡ‡Π½ΠΎΡΡ‚ΡŒ", "Π₯ΠΎΠ±Π±ΠΈΡ‚", "Маг".

[x]. ΠžΠ±ΡŠΠ΅ΠΊΡ‚ (object) - это ΡΡƒΡ‰Π½ΠΎΡΡ‚ΡŒ, относящаяся ΠΊ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌΡƒ классу, хранящая Π½Π°Π±ΠΎΡ€ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π°Ρ для ΠΈΡ… ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, прСдусмотрСнныС классом. ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²: "Ρ…ΠΎΠ±Π±ΠΈΡ‚ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ Π€Ρ€ΠΎΠ΄ΠΎ Бэггинс", "ΠΌΠ°Π³ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ Π“ΡΠ½Π΄Π°Π»ΡŒΡ„". Π‘ΠΈΠ½ΠΎΠ½ΠΈΠΌ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π° "ΠΎΠ±ΡŠΠ΅ΠΊΡ‚": экзСмпляр (instance) класса.

[x]. Атрибут (attribute) - описаниС характСристики ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒΡΡ Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅. ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ²: "имя", "рост". Набор ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² являСтся Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΌ состояниСм (state) ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ значСния Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°: "имя - Π“ΡΠ½Π΄Π°Π»ΡŒΡ„". Π‘ΠΈΠ½ΠΎΠ½ΠΈΠΌΡ‹ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π° "Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚": свойство (property), пСрСмСнная ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° (object variable), пСрСмСнная экзСмпляра (instance variable), Π΄Π°Π½Π½Ρ‹Π΅-элСмСнты (member data).

[x]. ΠœΠ΅Ρ‚ΠΎΠ΄ (method) - это дСйствиС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‰Π΅Π΅ Π΅Π³ΠΎ состояниС ΠΈΠ»ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰Π΅Π΅ Π΄Ρ€ΡƒΠ³ΠΎΠ΅ Π΅Π³ΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ²: "Π½Π°Π·Π²Π°Ρ‚ΡŒ своС имя", "ΡΡ‚Π°Ρ‚ΡŒ Π½Π΅Π²ΠΈΠ΄ΠΈΠΌΡ‹ΠΌ". Π‘ΠΈΠ½ΠΎΠ½ΠΈΠΌΡ‹ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π° "ΠΌΠ΅Ρ‚ΠΎΠ΄": опСрация (operation), функция-элСмСнт (member function).

[x]. Π˜Π½ΠΊΠ°ΠΏΡΡƒΠ»ΡΡ†ΠΈΡ (encapsulation) - это (1) объСдинСниС Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅ Π½Π°Π±ΠΎΡ€Π° Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π½ΠΈΠΌΠΈ; (2) ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ ограничСния доступа ΠΊ Π΄Π°Π½Π½Ρ‹ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, ΠΊΠΎΠ³Π΄Π° Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Π½ΠΈΠΌΠΈ ΠΌΠΎΠΆΠ½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Π΅Ρ€Π΅Π· Π΅Π³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ (скрытиС Π΄Π°Π½Π½Ρ‹Ρ…).

[x]. НаслСдованиС (inheritance) - это созданиС Π½ΠΎΠ²ΠΎΠ³ΠΎ класса Π½Π° основС ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ с Ρ†Π΅Π»ΡŒΡŽ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊ Π½Π΅ΠΌΡƒ Π½ΠΎΠ²Ρ‹Π΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ ΠΈΠ»ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π΅Π³ΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ наслСдования: Π½Π° основании класса "Π›ΠΈΡ‡Π½ΠΎΡΡ‚ΡŒ" ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ Π΅Π³ΠΎ подклассы "Π₯ΠΎΠ±Π±ΠΈΡ‚", "Маг", "Π­Π»ΡŒΡ„" ΠΈ "Π§Π΅Π»ΠΎΠ²Π΅ΠΊ", ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ свойствами ΠΈ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ "Личности", Π½ΠΎ добавляСт собствСнныС свойства ΠΈ мСняСт ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅.

[x]. ΠŸΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌ (polymorphism) - это Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‰ΠΈΡ… ΠΊ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌ классам, ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΈ ΠΊ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎ Π½Π°Π·Π²Π°Π½Π½ΠΎΠΌΡƒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌΠ°: Π² ΠΎΡ‚Π²Π΅Ρ‚ Π½Π° ΠΏΡ€ΠΈΠ·Ρ‹Π² "К ΠΎΡ€ΡƒΠΆΠΈΡŽ!" Π³Π½ΠΎΠΌ схватит Π±ΠΎΠ΅Π²ΠΎΠΉ Ρ‚ΠΎΠΏΠΎΡ€, ΡΠ»ΡŒΡ„ ΠΏΡ€ΠΈΠ³ΠΎΡ‚ΠΎΠ²ΠΈΡ‚ Π»ΡƒΠΊ ΠΈ стрСлы, Π° Ρ…ΠΎΠ±Π±ΠΈΡ‚ спрячСтся Π·Π° Π΄Π΅Ρ€Π΅Π²ΠΎ.

Но программистам, ΠΏΠΈΡˆΡƒΡ‰ΠΈΠΌ Π½Π° Perl, ΠΌΠΎΠΆΠ½ΠΎ Π½Π΅ Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°Ρ‚ΡŒ эти труднопроизносимыС Ρ‚Π΅Ρ€ΠΌΠΈΠ½Ρ‹. ΠžΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΊ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ рСализуСтся Π² Perl изящно ΠΈ Π»Π΅Π³ΠΊΠΎ - ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΡƒΠΆΠ΅ извСстных Π½Π°ΠΌ понятий ΠΈ конструкций.

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

[x]. Класс - это ΠΏΠ°ΠΊΠ΅Ρ‚, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ описаны ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ создаваСмых ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ².

[x]. ΠžΠ±ΡŠΠ΅ΠΊΡ‚ - это пСрСмСнная (ΠΈΠ»ΠΈ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅), Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ссылка, связанная с ΠΈΠΌΠ΅Π½Π΅ΠΌ ΠΏΠ°ΠΊΠ΅Ρ‚Π°.

[x]. ΠœΠ΅Ρ‚ΠΎΠ΄ - это ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΈΠ· ΠΏΠ°ΠΊΠ΅Ρ‚Π°, доступ ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ происходит ΠΏΠΎ ссылкС Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΎΠ½ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π² качСствС ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°.

[x]. Атрибуты ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° хранятся Π² динамичСски создаваСмых ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, Ρ‡Π°Ρ‰Π΅ всСго - Π² Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹Ρ… Ρ…ΡΡˆΠ°Ρ….

[x]. НаслСдованиС - это поиск ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½Π½Ρ‹Ρ… Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ ΠΏΠ°ΠΊΠ΅Ρ‚Π΅, Π² ΠΏΠ°ΠΊΠ΅Ρ‚Π°Ρ…, пСрСчислСнных Π² ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΌ массивС @ISA.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ описания классов срСдствами языка Perl ΠΈ ΠΏΡ€ΠΈΠ΅ΠΌΡ‹ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ.

Класс описываСтся Π² Π²ΠΈΠ΄Π΅ ΠΎΠ΄Π½ΠΎΠΈΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΏΠ°ΠΊΠ΅Ρ‚Π°, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°ΡŽΡ‚ΡΡ опрСдСлСния ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΠΈΡ… ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² этого класса. Описания ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ»ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… классов ΡΠΎΡ…Ρ€Π°Π½ΡΡŽΡ‚ΡΡ Π² Π²ΠΈΠ΄Π΅ модуля. Как ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² класса ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π·Π° созданиС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² класса. Π’Π°ΠΊΠΎΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ называСтся конструктором (constructor) ΠΈ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ носит имя new (ΠΈΠ»ΠΈ Π΅Π³ΠΎ имя совпадаСт с ΠΈΠΌΠ΅Π½Π΅ΠΌ класса). Для хранСния Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΎΡ‡Π΅Π½ΡŒ часто примСняСтся Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹ΠΉ Ρ…ΡΡˆ, ΠΊΠ»ΡŽΡ‡ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π·Π°Π΄Π°ΡŽΡ‚ ΠΈΠΌΠ΅Π½Π° Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ². ΠŸΠ΅Ρ€Π²Ρ‹ΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ конструктор ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ имя класса, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΎΠ½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ для прСобразования ссылки Π½Π° Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹ΠΉ Ρ…ΡΡˆ Π² ссылку Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ класса. Π­Ρ‚ΠΎ "магичСскоС" ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ выполняСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ встроСнной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ bless ("Π±Π»Π°Π³ΠΎΡΠ»ΠΎΠ²ΠΈΡ‚ΡŒ"), благодаря ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ созданный ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ помСчаСтся ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‰ΠΈΠΌ ΠΊ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌΡƒ классу. ПослС этого ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΈ ΠΊ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΎΠ½ΠΈ ΠΎΡ‚Ρ‹ΡΠΊΠΈΠ²Π°ΡŽΡ‚ΡΡ Π² ΠΏΠ°ΠΊΠ΅Ρ‚Π΅ с Ρ‚Π°ΠΊΠΈΠΌ ΠΆΠ΅ ΠΈΠΌΠ΅Π½Π΅ΠΌ. Π’ΠΎΡ‚ ΠΊΠ°ΠΊ происходит ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° "ссылка" Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ класса:


my $class = 'Hobbit'; # имя класса Π² Π²ΠΈΠ΄Π΅ строки my $object = { }; # ссылка Π½Π° Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹ΠΉ Ρ…ΡΡˆ, # Π³Π΄Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒΡΡ Π΄Π°Π½Π½Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, bless($object, $class); # "благословляСтся" ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ # Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса $class


Для ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° опишСм класс "Π›ΠΈΡ‡Π½ΠΎΡΡ‚ΡŒ" (Person), сохранив Π΅Π³ΠΎ Π² Ρ„Π°ΠΉΠ»Π΅ Person.pm. Начало описания класса Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Ρ‚Π°ΠΊ:


package Person; # класс - это ΠΏΠ°ΠΊΠ΅Ρ‚ sub new { # ΠΌΠ΅Ρ‚ΠΎΠ΄-конструктор ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² my $class = shift; # 1-ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ссылка Π½Π° имя класса my $self = {}; # ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ для Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° $self->{name} = ''; # Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹Π΅ значСния Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² bless($self, $class); # "Π±Π»Π°Π³ΠΎΡΠ»ΠΎΠ²ΠΈΡ‚ΡŒ" ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ссылки return $self; # Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ ссылку Π½Π° созданный ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ }


Π—Π°Ρ‚Π΅ΠΌ Π² описании класса ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ для доступа ΠΊ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. Для ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ для доступа (accessor) ΠΊ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρƒ 'name' ("имя") ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ для измСнСния Π΅Π³ΠΎ значСния (modifier).


sub say_name { # ΠΌΠ΅Ρ‚ΠΎΠ΄ доступа (accessor) ΠΊ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρƒ name my ($self) = @_; # ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ссылку Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ return $self->{name}; # Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° } sub give_name { # ΠΌΠ΅Ρ‚ΠΎΠ΄ измСнСния (modifier) Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° name my $self = $_[0]; # 1-ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚: ссылка Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ $self->{name} = $_[1]; # 2-ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚: Π½ΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ } 1; # истинноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ трСбуСтся для use __END__ # ΠΊΠΎΠ½Π΅Ρ† описания класса


Π’ классС ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² класса, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ часто ΠΎΠ΄ΠΈΠ½ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для чтСния ΠΈ для измСнСния значСния Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°. Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ опишСм ΠΌΠ΅Ρ‚ΠΎΠ΄ для чтСния ΠΈ записи (mutator) свойства 'height' ("рост"):


sub height { # ΠΌΠ΅Ρ‚ΠΎΠ΄ чтСния ΠΈ записи Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° height my $self = shift; # ΠΈΠ·Π²Π»Π΅Ρ‡ΡŒ ссылку Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ $self->{height} = shift # ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ Π½ΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, if @_; # Ссли ΠΏΠ΅Ρ€Π΅Π΄Π°Π½ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ return $self->{height}; # Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° }


ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ описаниС класса Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΡ€ΠΎΡ‰Π΅, Ρ‡Π΅ΠΌ описаниС Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ модуля. Для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с классом Π½Π΅ трСбуСтся Π½ΠΈΠΊΠ°ΠΊΠΈΡ… списков экспортирования ΠΈΠΌΠ΅Π½. ВмСсто этого ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ сСрвисы, прСдоставляСмыС классом для взаимодСйствия с ΠΊΠ°ΠΆΠ΄Ρ‹ΠΌ ΠΈΠ· ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… экзСмпляров класса. Набор ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² для управлСния ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ Π΅Π³ΠΎ интСрфСйсом. Для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ класса достаточно Π·Π½Π°Ρ‚ΡŒ этот интСрфСйс, Π½Π΅ вдаваясь Π² Π΄Π΅Ρ‚Π°Π»ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ повСдСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ².

Π’ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ описанного класса, ΠΌΡ‹ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ Π²ΠΏΠΎΠ»Π½Π΅ Π·Π½Π°ΠΊΠΎΠΌΡƒΡŽ Π½ΠΎΡ‚Π°Ρ†ΠΈΡŽ, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ссылочных ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ->. Π’ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎΠΉ Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΎΠ»ΠΎΠ³ΠΈΠΈ это называСтся ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ΠΌ ΠΊ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² (ΠΈΠ»ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ° сообщСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ). ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ создания Π΄Π²ΡƒΡ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΎΠ΄Π½ΠΎΠ³ΠΎ класса, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ собствСнными значСниями свойств:


# способ обращСния ΠΊ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌ Ρ‡Π΅Ρ€Π΅Π· ссылки Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ use Person; # Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ этот класс # ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса, my $hobbit = Person->new(); # Π²Ρ‹Π·Π²Π°Π² Π΅Π³ΠΎ конструктор # Π·Π°Π΄Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ свойства, ΠΎΠ±Ρ€Π°Ρ‚ΠΈΠ²ΡˆΠΈΡΡŒ ΠΊ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° $hobbit->give_name('Π€Ρ€ΠΎΠ΄ΠΎ Бэггинс'); # ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ my $dwarf = Person->new; # () Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ $dwarf->give_name('Π“ΠΈΠΌΠ»ΠΈ'); # Π·Π°Π΄Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ свойства # Π·Π°ΠΏΡ€ΠΎΡΠΈΡ‚ΡŒ значСния свойств, ΠΎΠ±Ρ€Π°Ρ‚ΠΈΠ²ΡˆΠΈΡΡŒ ΠΊ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌ print $hobbit->say_name(), ' ', $dwarf->say_name, "\n";