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

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

Жанры

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

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

Шрифт:

}

# метод доступа к атрибуту 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'

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

Обратите также внимание на то, что конструктор класса Private::Person определен так, что он может вызываться с использованием либо имени класса, либо ссылки на существующий объект. Это проверяется в следующей строке:

my $class = ref($invocant) || $invocant;

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

my $hobbit = Private::Person->new; # вызов с именем класса

$hobbit->name("Bilbo Baggins");

my $frodo = $hobbit->new; # вызов со ссылкой на объект

$frodo->name("Frodo Baggins");

В классе могут быть определены методы, не предназначенные для работы с конкретными объектами. Такие методы называются методами класса или статическими методами. Для обращения к ним, так же как для обращения к конструктору, используется имя класса, а не ссылка на объект. Часто эти методы обслуживают данные, общие для всех объектов класса (то есть объявленные глобально на уровне класса). Подобные данные называются атрибутами класса. В качестве примера опишем класс Magic::Ring, где метод класса count будет использоваться для доступа к значению атрибута класса $Magic::Ring::count, в котором будет храниться количество созданных волшебных колец.

package Magic::Ring; # класс "Магическое Кольцо"

sub new { # конструктор

my ($class, $owner) = @_; # имя класса и значение атрибута

$Magic::Ring::count++; # сосчитать новое Кольцо

bless({owner => $owner}, $class); # "благословить"
хэш

}

sub owner { # метод чтения и записи атрибута owner

my $self = shift; # извлечь ссылку на объект

$self->{owner} = shift if @_; # изменить значение атрибута

return $self->{owner}; # вернуть значение атрибута

}

$Magic::Ring::count = 0; # атрибут класса: число Колец

sub count { # метод класса

return $Magic::Ring::count;

}

1; # конец описания класса Magic::Ring

В программе, использующей класс Magic::Ring, создается набор объектов. При каждом обращении к конструктору увеличивается счетчик созданных магических колец $Magic::Ring::count.

package main;

use Magic::Ring; # использовать класс "Магическое Кольцо"

my @rings = ;

for (1..3) { # "Три кольца - премудрым эльфам..."

push @rings, new Magic::Ring('эльф');

}

for (1..7) { # "Семь колец - пещерным гномам..."

push @rings, new Magic::Ring('гном');

}

for (1..9) { # "Девять - людям Средиземья..."

push @rings, new Magic::Ring('человек');

}

# "А Одно - всесильное - Властелину Мордора..."

push @rings, new Magic::Ring('Саурон');

# Сколько всего было сделано колец?

print Magic::Ring->count, "\n"; # будет выведено: 20

В стандартную библиотеку модулей Perl входит модуль Class::Struct, который облегчает жизнь программистам по описанию классов, предоставляя для объявления класса функцию struct. Эта функция генерирует описание класса в указанном пакете, включая методы для доступа к атрибутам класса. Причем помимо имени атрибута она позволяет задавать его тип с помощью разыменовывающего префикса: скаляр ($), массив (@), хэш (%), ссылка на подпрограмму (&) или объект. Насколько просто и удобно пользоваться функцией struct, можно судить по такому примеру:

use Class::Struct; # подключаем стандартный модуль

# описываем класс Performer ("Исполнитель")

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

name => '$', # "имя" - скаляр

country => '$', # "страна" - скаляр

artists => '%', # "артисты" - хэш

};

my $performer = new Performer; # создаем исполнителя

$performer->name('Pink Floyd'); # задаем значения атрибутов

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

Пушкарь. Пенталогия

Корчевский Юрий Григорьевич
Фантастика:
альтернативная история
8.11
рейтинг книги
Пушкарь. Пенталогия

Наследие Маозари 6

Панежин Евгений
6. Наследие Маозари
Фантастика:
попаданцы
постапокалипсис
рпг
фэнтези
эпическая фантастика
5.00
рейтинг книги
Наследие Маозари 6

Аватар

Жгулёв Пётр Николаевич
6. Real-Rpg
Фантастика:
боевая фантастика
5.33
рейтинг книги
Аватар

Жена со скидкой, или Случайный брак

Ардова Алиса
Любовные романы:
любовно-фантастические романы
8.15
рейтинг книги
Жена со скидкой, или Случайный брак

Ты - наша

Зайцева Мария
1. Наша
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Ты - наша

Креститель

Прозоров Александр Дмитриевич
6. Ведун
Фантастика:
фэнтези
8.60
рейтинг книги
Креститель

Моя простая курортная жизнь 7

Блум М.
7. Моя простая курортная жизнь
Фантастика:
дорама
гаремник
5.00
рейтинг книги
Моя простая курортная жизнь 7

Адвокат Империи 9

Карелин Сергей Витальевич
Адвокат империи
Фантастика:
городское фэнтези
аниме
дорама
фантастика: прочее
попаданцы
5.00
рейтинг книги
Адвокат Империи 9

Петля, Кадетский корпус. Книга третья

Алексеев Евгений Артемович
3. Петля
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Петля, Кадетский корпус. Книга третья

Ермак. Регент

Валериев Игорь
10. Ермак
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Ермак. Регент

Черный Маг Императора 11

Герда Александр
11. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Черный Маг Императора 11

Запасная дочь

Зика Натаэль
Фантастика:
фэнтези
6.40
рейтинг книги
Запасная дочь

На границе империй. Том 10. Часть 4

INDIGO
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 10. Часть 4

Мечников. Открытие века

Алмазов Игорь
4. Жизнь Лекаря с нуля
Фантастика:
альтернативная история
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Мечников. Открытие века