Чтение онлайн

на главную

Жанры

Язык программирования Perl
Шрифт:

# описываем класс Album ("Альбом")

struct Album => { # атрибуты класса:

title => '$', # "название" - скаляр

year => '$', # "год выхода" - скаляр

tracks => '@', # "композиции" - массив

performer => 'Performer', # "исполнитель" - объект

};

my $album = Album->new; # создаем альбом

$album->title('Dark Side of the Moon');

$album->year(1973);

#
заполняем атрибут-массив:

$album->tracks(0, 'Breathe');

$album->tracks(1, 'Time');

# и так далее...

$album->performer($performer); # задаем атрибут-объект

Чтобы добавить к полученному описанию класса дополнительный метод, достаточно описать его в соответствующем пакете. Вот пример добавления метода Album::print и его использования в главной программе:

package Album; # переключаемся на нужный пакет

sub Album::print { # и описываем дополнительный метод

my $self = shift;

printf("%s '%s' (%d)\n",

$self->performer->name, $self->title, $self->year);

foreach my $artist (keys%{$self->performer->artists}) {

printf("\t%s - %s\n",

$artist, $self->performer->artists($artist));

}

}

package main; # переключаемся на основную программу

$album->print; # и вызываем метод объекта

В заключение рассмотрим несколько распространенных приемов для работы с классами и объектами.

Функции bless не обязательно передавать имя класса: если второго аргумента нет, она помечает объект ссылки именем текущего пакета. Поскольку bless возвращает значение своего первого аргумента, а подпрограмма возвращает последнее вычисленное значение, то минимальный конструктор может выглядеть так:

sub new { # конструктор экземпляров класса

my $self = {}; # контейнер для атрибутов объекта

bless($self); # "благословить" объект ссылки

} # и вернуть ссылку (1-й аргумент bless)

При создании объекта удобно сразу задавать начальные значения его атрибутов, передавая аргументы конструктору. Если для инициализации атрибутов использовать хэш, то атрибуты можно задавать в любом порядке, а в конструкторе можно определить значения по умолчанию для незаданных атрибутов. Например, так:

my $language = Programming::Language->new(

NAME => 'Perl', # имя

VERSION => '5.8.7', # версия

AUTHOR = 'Larry Wall' #
автор

);

Весьма полезно иметь в классе метод, который преобразовывает значения атрибутов объекта в строку. Такой метод обычно называется as_string или to_string и может применяться для отладочной печати состояния объекта. А если его определить в классе-"прародителе", то его можно будет применять к объектам всех унаследованных классов. Если использовать анонимный хэш для хранения значений атрибутов, то такой метод может выглядеть так:

sub to_string { # преобразование значений атрибутов в строку

my $self = shift;

my $string = '{ ';

foreach (keys %{$self}) {

$string .= "$_: '$self->{$_}' ";

}

$string .= '}';

return $string;

}

Благодаря тому, что Perl - это динамический язык, в нем легко создать класс, в котором свойства объектов добавляются во время выполнения программы. Для этого в классе описываются универсальные методы для работы со свойствами объекта, а затем в ходе выполнения задаются нужные свойства. Например, так:

package Human; # класс "Человек"

our @ISA = qw(Person); # это подкласс класса Person

use Person;

sub set { # универсальный метод изменения атрибутов объекта

my ($self, $name, $new_value) = @_;

my $old_value = $self->{$name};

$self->{$name} = $new_value;

return $old_value;

}

sub get { # универсальный метод доступа к атрибутам объекта

my ($self, $name) = @_;

return $self->{$name};

}

1;

package main; # главная программа

use Human; # подключить класс

my $hero = Human->new; # создать героя-человека

$hero->set ('имя', 'Арагорн'); # дать ему имя

$hero->set ('оружие', 'меч'); # и вооружить

В этой лекции мы научились работать с объектами. Объектный подход реализован в Perl весьма своеобразно, но понятно и эффективно. Использование этой технологии дает программисту возможность создавать приложения, соответствующие современным требованиям. А сочетание объектного программирования с динамической природой языка позволяет реализовывать оригинальные и эффективные решения.

Поделиться:
Популярные книги

Восход. Солнцев. Книга X

Скабер Артемий
10. Голос Бога
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Восход. Солнцев. Книга X

Мастер 7

Чащин Валерий
7. Мастер
Фантастика:
фэнтези
боевая фантастика
попаданцы
технофэнтези
аниме
5.00
рейтинг книги
Мастер 7

Неудержимый. Книга XIV

Боярский Андрей
14. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Неудержимый. Книга XIV

Все не случайно

Юнина Наталья
Любовные романы:
современные любовные романы
7.10
рейтинг книги
Все не случайно

Гром над Тверью

Машуков Тимур
1. Гром над миром
Фантастика:
боевая фантастика
5.89
рейтинг книги
Гром над Тверью

Идущий в тени 5

Амврелий Марк
5. Идущий в тени
Фантастика:
фэнтези
рпг
5.50
рейтинг книги
Идущий в тени 5

Кровь, золото и помидоры

Распопов Дмитрий Викторович
4. Венецианский купец
Фантастика:
альтернативная история
5.40
рейтинг книги
Кровь, золото и помидоры

Неудержимый. Книга VIII

Боярский Андрей
8. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
6.00
рейтинг книги
Неудержимый. Книга VIII

Чужое наследие

Кораблев Родион
3. Другая сторона
Фантастика:
боевая фантастика
8.47
рейтинг книги
Чужое наследие

Пистоль и шпага

Дроздов Анатолий Федорович
2. Штуцер и тесак
Фантастика:
альтернативная история
8.28
рейтинг книги
Пистоль и шпага

Мастер 4

Чащин Валерий
4. Мастер
Фантастика:
героическая фантастика
боевая фантастика
попаданцы
5.00
рейтинг книги
Мастер 4

Темный Патриарх Светлого Рода 6

Лисицин Евгений
6. Темный Патриарх Светлого Рода
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Темный Патриарх Светлого Рода 6

Лорд Системы 14

Токсик Саша
14. Лорд Системы
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Лорд Системы 14

Падение Твердыни

Распопов Дмитрий Викторович
6. Венецианский купец
Фантастика:
попаданцы
альтернативная история
5.33
рейтинг книги
Падение Твердыни