Об’єктна орієнтація
Поняття об’єктної орієнтації грунтується на трьох простих визначеннях:
Об’єкт це просто посилання.
Клас це просто пакет, який містить методи для роботи з об’єктними посиланнями.
Метод це просто підпрограма, яка має своїм першим аргументом об’єктне посилання (або ім’я пакету для статичного методу).
5.1 Об’єкти
На відміну від C++, Perl не має спеціального синтаксису для опису конструкторів. Конструктор, як вже мовилося раніше, це просто підпрограма, яка повертає посилання асоційовану з класом (як правило з тим, де визначена підпрограма). Наприклад, типовий конструктор:
package Critter;
sub new { bless { }
{ створює посилання на анонімний хэш.
В межах класу методи як правило працюють із звичайними посиланнями. Конструктор може прив’язати об’єкт до іншого класу, у такому разі попередня прив’язка буває забута, оскільки об’єкт не може належати одночасно декільком класам.
5.2 Класи
На відміну від C++, Perl не має спеціального синтаксису для опису класів. Класом є пакет, чиї підпрограми виступають як методи. Для кожного пакету визначений спеціальний масив @ISA, у якому перераховані пакети, підключені до даного пакету. Таким чином в Perl реалізований механізм спадкоємства методів. Метод, що належить іншому об’єкту, підключається як підпрограма.
5.3 Методи
У Perl-і метод має синтаксис простої підпрограми. Як перший аргумент методу виступає об’єкт або пакет. Існує два типи методів: статичні і віртуальні методи.
Статичні методи мають першим аргументом ім’я класу. Вони забезпечують функціональність для класу в цілому, а не для окремих об’єктів тих, що належать класу. Конструктори є, як правило, статичними методами. Багато статичних методів просто ігнорують свій перший аргумент, оскільки заздалегідь знають, якому пакету вони належать. Інший спосіб використання статичних методів полягає в тому, що метод працює з об’єктом, використовуючи ім’я:
sub find {
my ($class, $name) = @_;
$objtable{$name};
}
Віртуальні методи мають першим аргументом посилання на об’єкт. Зазвичай вони поміщають це посилання в змінну self або this і надалі використовують її як звичайне посилання.
sub display {
my $self = shift;
my @keys = @_ ? @_ : sort keys %$self;
foreach $key (@keys) {
print “\t$key => $self ->{$key}n”;
}
}
5.4 Виклик методу
Існує два способи звернутися до методу. По-перше, можна викликати його просто як підпрограму. Але у такому разі не працює механізм спадкоємства. Другий спосіб краще просто проілюструвати прикладами.
$fred = find Critter “Fred”;
display $fred, ‘Height’, ‘Weight’;
Це можна записати так:
display {find Critter “Fred”} ‘Height’, ‘Weight’;
5.5 Деструкції
Коли видаляється останнє посилання на об’єкт, цей об’єкт автоматично видаляється. Це може відбутися навіть після завершення програми, якщо посилання на об’єкт містилися в глобальних змінних. Якщо необхідно контролювати процес видалення об’єкту, можна визначити в об’єкті спеціальний метод, званий деструкцією. Деструкцію об’єкту (на відміну від C++) має фіксоване ім’я DESTROY і викликається перед видаленням об’єкту. У ньому можна реалізувати додаткові процедури, необхідні для коректного завершення (наприклад, видалення тимчасових файлів, використовуваних об’єктом).