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

на главную - закладки

Жанры

Язык программирования Perl

Шохирев Михаил Васильевич

Шрифт:

$performer->country('Great Britain');

# заполняем атрибут-хэш:

$performer->artists('David Gilmour', 'гитары, вокал');

$performer->artists('Roger Waters', 'бас-гитара, вокал');

$performer->artists('Nick Mason', 'ударные');

$performer->artists('Richard Wright', 'клавишные');

# описываем класс 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 весьма своеобразно, но понятно и эффективно. Использование этой технологии дает программисту возможность создавать приложения, соответствующие современным требованиям. А сочетание объектного программирования с динамической природой языка позволяет реализовывать оригинальные и эффективные решения.

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

Записки брюнетки

Голубицкая Жанна
Проза:
современная проза
4.25
рейтинг книги
Записки брюнетки

Вельяминовы - Дорога на восток. Книга 2

Шульман Нелли
2. Дорога на восток
Приключения:
исторические приключения
5.00
рейтинг книги
Вельяминовы - Дорога на восток. Книга 2

Егерь. Прилив. Книга 10

Скиба Николай
10. Зверолов
Фантастика:
рпг
фэнтези
фантастика: прочее
попаданцы
5.25
рейтинг книги
Егерь. Прилив. Книга 10

Логическая история цивилизации на Земле Дополнительные доказательства моей теории (часть вторая)

Синюков Борис Прокопьевич
Научно-образовательная:
история
5.00
рейтинг книги
Логическая история цивилизации на Земле Дополнительные доказательства моей теории (часть вторая)

Этюды желудочной хирургии

Юдин Сергей Сергеевич
Классика и современность
Научно-образовательная:
медицина
5.00
рейтинг книги
Этюды желудочной хирургии

Судьбоносный или как попасть в другой мир

Маклуха Маклай
Фантастика:
фэнтези
рпг
фантастика: прочее
6.64
рейтинг книги
Судьбоносный или как попасть в другой мир

Без правил

Муравьева Галина Д.
1. 1d
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Без правил

Отморозок 5

Поповский Андрей Владимирович
5. Отморозок
Фантастика:
попаданцы
альтернативная история
5.25
рейтинг книги
Отморозок 5

Благие намерения

Лукина Любовь Александровна
Фантастика:
фэнтези
научная фантастика
7.50
рейтинг книги
Благие намерения

Гильдия. Компиляция 1-10

Бергер Евгений
Гильдия
Фантастика:
боевая фантастика
альтернативная история
5.00
рейтинг книги
Гильдия. Компиляция 1-10

Рейд к звездам

Ван Вогт Альфред Элтон
Фантастика:
научная фантастика
5.00
рейтинг книги
Рейд к звездам

Вор и Книга Демона

Эддингс Дэвид
Фантастика:
героическая фантастика
8.50
рейтинг книги
Вор и Книга Демона

Русская фантастика 2010

Алёхин Леонид
Фантастика:
научная фантастика
боевая фантастика
5.00
рейтинг книги
Русская фантастика 2010

Женщина для утех семьи Бэкхейм

Летова Ефимия
Фантастика:
фэнтези
5.00
рейтинг книги
Женщина для утех семьи Бэкхейм