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

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

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

ВзаимодСйствиС с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ строится Π½Π° ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΈ ΠΊ Π΅Π³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌ. ΠžΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ происходит ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ссылки Π½Π° экзСмпляр ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, ΠΈ ΠΏΡ€ΠΈ этом ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ Π² ΠΌΠ΅Ρ‚ΠΎΠ΄ автоматичСски пСрСдаСтся ссылка Π½Π° этот ΠΎΠ±ΡŠΠ΅ΠΊΡ‚. НапримСр:


$hobbit->give_name('Π‘ΠΈΠ»ΡŒΠ±ΠΎ Бэггинс'); # соотвСтствуСт Π²Ρ‹Π·ΠΎΠ²Ρƒ: Person::give_name($hobbit, 'Π‘ΠΈΠ»ΡŒΠ±ΠΎ Бэггинс');


Π’Π½ΡƒΡ‚Ρ€ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ссылка Π½Π° экзСмпляр ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для доступа ΠΊ Π΄Π°Π½Π½Ρ‹ΠΌ этого экзСмпляра ΠΈ обращСния ΠΊ Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌ. Для обращСния ΠΊ конструктору ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ имя класса, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π²ΠΎ врСмя Ρ€Π°Π±ΠΎΡ‚Ρ‹ конструктора ΡƒΠΆΠ΅ сущСствуСт класс, Π° экзСмпляр ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ создан конструктором.

Если ΠΊ ссылкС Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса Person ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ref(), Ρ‚ΠΎ ΠΎΠ½Π° Π²Π΅Ρ€Π½Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π΅ 'HASH', ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ, Π° 'Person'! Π­Ρ‚ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ "благословСния" ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ссылки Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ bless().


print "Класс ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°: '", ref($hobbit), "'\n"; # 'Person'


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


# способ обращСния ΠΊ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌ Ρ‡Π΅Ρ€Π΅Π· косвСнныС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ use Person; # ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ класс Person my $magician = new Person; # "этот ΠΌΠ°Π³ - новая Π»ΠΈΡ‡Π½ΠΎΡΡ‚ΡŒ" give_name $magician 'Π“ΡΠ½Π΄Π°Π»ΡŒΡ„'; # "Π½Π°Π·ΠΎΠ²Π΅ΠΌ ΠΌΠ°Π³Π° 'Π“ΡΠ½Π΄Π°Π»ΡŒΡ„'" my $name = say_name $magician; # "Π½Π°Π·ΠΎΠ²ΠΈ сСбя, ΠΌΠ°Π³" print $name, "\n";


Π’ качСствС ΠΈΠ»Π»ΡŽΡΡ‚Ρ€Π°Ρ†ΠΈΠΈ ΠΊ сказанному Π½Π° рис. 14.1 ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½Ρ‹ языковыС конструкции, примСняСмыС ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ, ΠΈ ΠΈΡ… взаимосвязи.

Рис. 14.1.  ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎΠ³ΠΎ программирования Π² Perl

НаслСдованиС - это ΠΌΠΎΡ‰Π½Ρ‹ΠΉ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ конструирования Π½ΠΎΠ²ΠΎΠ³ΠΎ класса, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΉ ΡƒΡ‚ΠΎΡ‡Π½ΠΈΡ‚ΡŒ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ класс, ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π΅Π³ΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ класса ΠΈΠ»ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊ Π½Π΅ΠΌΡƒ Π½ΠΎΠ²Ρ‹Π΅ свойства. Π’ Perl это дСлаСтся Π»Π΅Π³ΠΊΠΎ ΠΈ просто: Π½ΡƒΠΆΠ½ΠΎ ΡƒΠΏΠΎΠΌΡΠ½ΡƒΡ‚ΡŒ имя Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ класса Π² ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΌ массивС @ISA Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ класса. Π˜ΡΠΏΠΎΠ»Π½ΡΡŽΡ‰Π°Ρ систСма, Π½Π΅ найдя Π²Ρ‹Π·Π²Π°Π½Π½ΠΎΠ³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ ΠΌΠΎΠ΄ΡƒΠ»Π΅, ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅Ρ‚ Π΅Π³ΠΎ поиск Π² ΠΏΠ°ΠΊΠ΅Ρ‚Π°Ρ…, пСрСчислСнных Π² массивС @ISA. ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ описания класса Wizard, ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΎΡ‚ класса Person:


package Wizard; # класс "Маг" our @ISA = qw(Person); # являСтся подклассом Person use Person; # ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΏΠ°ΠΊΠ΅Ρ‚ Person # ... описаниС ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² класса Wizard... 1; # Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ истину для use


Бмысл наслСдования - Π² создании подклассов, ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‰ΠΈΡ… ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса. Для этого Π² Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΡ… классах ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ Π½ΠΎΠ²Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΈΠ»ΠΈ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅. Π’ качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° опишСм для класса Wizard Π½ΠΎΠ²Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ со свойством 'magic' ("Ρ‚ΠΈΠΏ ΠΌΠ°Π³ΠΈΠΈ" - бСлая ΠΈΠ»ΠΈ чСрная):


sub magic { # магия - Π²ΠΎΡ‚ Ρ‡Ρ‚ΠΎ ΠΎΡ‚Π»ΠΈΡ‡Π°Π΅Ρ‚ волшСбника my $self = shift; # ΠΈΠ·Π²Π»Π΅Ρ‡ΡŒ ссылку Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ $self->{magic} = shift if @_; # ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ return $self->{magic}; # Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ }


ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ конструктор ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² класса new() Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π» Π΄Π²Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° для ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ свойств 'name' ΠΈ 'magic'. Для создания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ конструктором Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ класса, Π·Π°Ρ‚Π΅ΠΌ Π·Π°Π΄Π°Π΄ΠΈΠΌ Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹Π΅ значСния свойств, ΠΈ, Π½Π°ΠΊΠΎΠ½Π΅Ρ†, "Π΄Π°Π΄ΠΈΠΌ благословСниС" ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ ссылки Π±Ρ‹Ρ‚ΡŒ ΠΌΠ°Π³ΠΎΠΌ:


sub new { # конструктор ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² my $class = $_[0]; # имя класса Π² 1-ΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π΅ my $self = new Person; # ΠΌΠ°Π³ - это Π»ΠΈΡ‡Π½ΠΎΡΡ‚ΡŒ $self->{name} = $_[1]; # Π·Π°Π΄Π°Ρ‚ΡŒ имя ΠΈΠ· 2-Π³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° $self->{magic} = $_[2]; # ΠΈ Ρ‚ΠΈΠΏ ΠΌΠ°Π³ΠΈΠΈ ΠΈΠ· 3-Π³ΠΎ bless($self, $class); # "Π±Π»Π°Π³ΠΎΡΠ»ΠΎΠ²ΠΈΡ‚ΡŒ" ΠΌΠ°Π³Π° return $self; # Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ ссылку Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ }


Π’Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π°Ρ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π°Ρ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΉ класс, Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:


use Wizard; # ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΉ класс # ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½ΠΎΠ²ΠΎΠ³ΠΎ Ρ‡Π΅Ρ€Π½ΠΎΠ³ΠΎ ΠΌΠ°Π³Π° - Π‘Π°Ρ€ΡƒΠΌΠ°Π½Π° my $wizard = new Wizard('Π‘Π°Ρ€ΡƒΠΌΠ°Π½', 'black'); my $name = say_name $wizard; # "Π½Π°Π·ΠΎΠ²ΠΈ сСбя, ΠΌΠ°Π³" print $name, ' ', $wizard->magic(); # 'Π‘Π°Ρ€ΡƒΠΌΠ°Π½ black' print ref($wizard); # Ρ‚ΠΈΠΏ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ссылки - 'Wizard'


ЕстСствСнно, Ρ‡Ρ‚ΠΎ Ρƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° класса Wizard ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ собствСнного класса, Π½ΠΎ ΠΈ Π»ΡŽΠ±Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, унаслСдованныС ΠΈΠ· Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ класса Person.

Π’ классС ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ описан ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄, автоматичСски Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ ΠΈΡΠΏΠΎΠ»Π½ΡΡŽΡ‰Π΅ΠΉ систСмой ΠΏΡ€ΠΈ ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ΅Π½ΠΈΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. Π’Π°ΠΊΠΎΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ называСтся дСструктор (destructor), ΠΈ ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠΌΠ΅Ρ‚ΡŒ Π·Π°Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ имя - DESTROY. ДСструктор вызываСтся ΠΏΡ€ΠΈ освобоТдСнии памяти, Π·Π°Π½ΠΈΠΌΠ°Π΅ΠΌΠΎΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ: это происходит ΠΏΡ€ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π΅ ΠΈΠ· Π±Π»ΠΎΠΊΠ°, Π³Π΄Π΅ Π±Ρ‹Π» создан ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΏΡ€ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠΈ послСднСй ссылки Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ undef($object) ΠΈΠ»ΠΈ ΠΏΡ€ΠΈ ΠΎΠΊΠΎΠ½Ρ‡Π°Π½ΠΈΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΡˆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ дСструктора для класса Person, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° направляСт ΠΏΡ€ΠΎΡ‰Π°Π½ΠΈΠ΅ Π² ΠΏΠΎΡ‚ΠΎΠΊ STDERR, называя имя ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ say_name():


sub DESTROY { warn('ΠŸΡ€ΠΎΡ‰Π°ΠΉΡ‚Π΅, я ΡƒΡ…ΠΎΠΆΡƒ... ' . shift->say_name); }


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

АнонимныС Ρ…ΡΡˆΠΈ - это самый распространСнный, Π½ΠΎ Π½Π΅ СдинствСнный способ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ значСния Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. Для этого ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ массив ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ скалярная пСрСмСнная, лишь Π±Ρ‹ ΠΏΡ€ΠΈ создании ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π² конструкторС это Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π±Ρ‹Π»ΠΎ связано с ΠΈΠΌΠ΅Π½Π΅ΠΌ класса Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ bless(). НСдостатком этого ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° ΠΌΠΎΠΆΠ½ΠΎ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ доступа ΠΊ свойствам достигаСтся лишь Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ соглашСния ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. И ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ сущСствуСт Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ, это ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°Ρ€ΡƒΡˆΠΈΡ‚ΡŒ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΡƒΡŽ Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π’Π΅Π΄ΡŒ Π² ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ состояния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° сопровоТдаСтся Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΌΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ°ΠΌΠΈ, Ρ‡Π΅Π³ΠΎ Π½Π΅ происходит ΠΏΡ€ΠΈ нСпосрСдствСнном ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°. Π’Π΅ΠΌ Π±ΠΎΠ»Π΅Π΅, Ρ‡Ρ‚ΠΎ Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… случаях Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ Π²ΠΎΠΎΠ±Ρ‰Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ доступны Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для чтСния (read-only attribute). НапримСр, ΠΏΡ€ΠΈ использовании Ρ…ΡΡˆΠ° для хранСния Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² Π²ΠΏΠΎΠ»Π½Π΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠ΅ присваиваниС:


$hobbit->{magic} = 'пёстрая'; # Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ ΠΎΡˆΠΈΠ±ΠΎΡ‡Π½Ρ‹ΠΉ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚


Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°Π΄Π΅ΠΆΠ½ΠΎ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ доступа ΠΊ Π΄Π°Π½Π½Ρ‹ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ хранятся Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅, ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ замыкания. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹Π΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ (private attributes) с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠΉ, напишСм класс Private::Person. Π’ Π½ΠΎΠ²ΠΎΠΉ вСрсии класса значСния Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² Ρ‚Π°ΠΊΠΆΠ΅ хранятся Π² Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΠΎΠΌ Ρ…ΡΡˆΠ΅, Π½ΠΎ ΠΏΡ€ΠΈ создании ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° возвращаСтся ссылка Π½Π΅ Π½Π° Π½Π΅Π³ΠΎ, Π° Π½Π° Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΡƒΡŽ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ доступа ΠΊ Π΄Π°Π½Π½Ρ‹ΠΌ. Π­Ρ‚ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒΡΡ имя Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° (ΠΈ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π½ΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅), Π° ΠΎΠ½Π° Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ имя Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° ΠΊΠ°ΠΊ ΠΊΠ»ΡŽΡ‡ поиска Π² Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΠΎΠΌ массивС. Π­Ρ‚ΠΎ выглядит Ρ‚Π°ΠΊ:


package Private::Person; # класс "Π›ΠΈΡ‡Π½ΠΎΡΡ‚ΡŒ" sub new { # ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏΠΎΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ my $invocant = shift; # класс ΠΈΠ»ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ my $class = ref($invocant) || $invocant; my $self = { # значСния Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ²: NAME => '', # имя ΠΈ HEIGHT => 0.0 # рост }; my $closure = sub { # функция доступа ΠΊ Π΄Π°Π½Π½Ρ‹ΠΌ my $field = shift; # ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° $self->{$field} = shift if @_; # ΠΈΠ·ΠΌΠ΅Π½ΠΈΠΌ ΠΈ return $self->{$field}; # Π²Π΅Ρ€Π½Π΅ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ }; # ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ Π±ΡƒΠ΄Π΅Ρ‚ bless($closure, $class); # ссылка Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ } # ΠΌΠ΅Ρ‚ΠΎΠ΄ доступа ΠΊ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρƒ name sub name { my $self = shift; # ссылка Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ &{$self}("NAME", @_); # доступ ΠΊ скрытому Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ } # ΠΌΠ΅Ρ‚ΠΎΠ΄ доступа ΠΊ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρƒ height sub height { # Ρ‚ΠΎ ΠΆΠ΅, Ρ‡Ρ‚ΠΎ Π²Ρ‹ΡˆΠ΅, Π½ΠΎ нСсколько ΠΊΠΎΡ€ΠΎΡ‡Π΅: &{ $_[0] }("HEIGHT", @_[1 .. $#_ ] ) } 1;


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


package main; # Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π°Ρ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° use Private::Person; # ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ этот класс my $elf = Private::Person->new; # ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈ $elf->name("ЛСголас"); # Π·Π°Π΄Π°Ρ‚ΡŒ значСния $elf->height(189); # Π΅Π³ΠΎ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌ # ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ значСниям Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° print $elf->name, ' ', $elf->height, ' '; print ref($elf), "\n"; # Ρ‚ΠΈΠΏ Ρ€Π΅Ρ„Π΅Ρ€Π΅Π½Ρ‚Π°: 'Private::Person'


Из ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ имя класса ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ составным, отраТая ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΡŽ классов. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ классы - это ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹, хранящиСся Π² Ρ„Π°ΠΉΠ»Π΅-ΠΌΠΎΠ΄ΡƒΠ»Π΅, Ρ‚ΠΎ всС, Ρ‡Ρ‚ΠΎ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΎΡΡŒ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ Π»Π΅ΠΊΡ†ΠΈΠΈ ΠΎΠ± ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠΈ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ, относится ΠΈ ΠΊ классам.