Класс описывается в виде одноименного пакета, в котором размещаются определения методов, реализующих поведение объектов этого класса. Описания одного или нескольких классов сохраняются в виде модуля. Как минимум один из методов класса отвечает за создание объектов класса. Такой метод называется конструктором (constructor) и обычно носит имя new (или его имя совпадает с именем класса). Для хранения атрибутов объекта очень часто применяется анонимный хэш, ключи которого задают имена атрибутов. Первым аргументом конструктор получает имя класса, которое он использует для преобразования ссылки на анонимный хэш в ссылку на объект указанного класса. Это "магическое" превращение выполняется с помощью встроенной функции
my $class = 'Hobbit'; # имя класса в виде строки
my $object = { }; # ссылка на анонимный хэш,
# где будут храниться данные объекта,
bless($object, $class); # "благословляется" указывать
# на объект класса $class
Для примера опишем класс "Личность" (Person), сохранив его в файле Person.pm. Начало описания класса будет выглядеть так:
package Person; # класс - это пакет
sub new { # метод-конструктор объектов
my $class = shift; # 1-й параметр ссылка на имя класса
my $self = {}; # контейнер для атрибутов объекта
$self->{name} = ''; # начальные значения атрибутов
bless($self, $class); # "благословить" объект ссылки
return $self; # вернуть ссылку на созданный объект
}
Затем в описании класса обычно определяются методы для доступа к атрибутам объекта. Для примера определим метод для доступа (accessor) к атрибуту
sub say_name { # метод доступа (accessor) к атрибуту name
my ($self) = @_; # получить ссылку на объект
return $self->{name}; # вернуть значение атрибута
}
sub give_name { # метод изменения (modifier) атрибута name
my $self = $_[0]; # 1-й аргумент: ссылка на объект
$self->{name} = $_[1]; # 2-й аргумент: новое значение
}
1; # истинное значение требуется для use
__END__ # конец описания класса
В классе описываются методы для работы с атрибутами объектов класса, причем часто один метод используется для чтения и для изменения значения атрибута. В примере опишем метод для чтения и записи (mutator) свойства
sub height { # метод чтения и записи атрибута height
my $self = shift; # извлечь ссылку на объект
$self->{height} = shift # присвоить новое значение,
if @_; # если передан аргумент
return $self->{height}; # вернуть значение атрибута
}
Обратите внимание, что описание класса значительно проще, чем описание традиционного модуля. Для работы с классом не требуется никаких списков экспортирования имен. Вместо этого описываются методы, которые можно рассматривать как сервисы, предоставляемые классом для взаимодействия с каждым из конкретных экземпляров класса. Набор методов для управления поведением объекта называют его интерфейсом. Для работы с объектами класса достаточно знать этот интерфейс, не вдаваясь в детали реализации поведения объектов.
Вильям Л Саймон , Вильям Саймон , Наталья Владимировна Макеева , Нора Робертс , Юрий Викторович Щербатых
Зарубежная компьютерная, околокомпьютерная литература / ОС и Сети, интернет / Короткие любовные романы / Психология / Прочая справочная литература / Образование и наука / Книги по IT / Словари и Энциклопедии