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



              

Описание классов


Класс описывается в виде одноименного пакета, в котором размещаются определения методов, реализующих поведение объектов этого класса. Описания одного или нескольких классов сохраняются в виде модуля. Как минимум один из методов класса отвечает за создание объектов класса. Такой метод называется конструктором (constructor) и обычно носит имя new (или его имя совпадает с именем класса). Для хранения атрибутов объекта очень часто применяется анонимный хэш, ключи которого задают имена атрибутов. Первым аргументом конструктор получает имя класса, которое он использует для преобразования ссылки на анонимный хэш в ссылку на объект указанного класса. Это "магическое" превращение выполняется с помощью встроенной функции bless ("благословить"), благодаря которой каждый созданный объект помечается принадлежащим к определенному классу. После этого при обращении к методам объекта они отыскиваются в пакете с таким же именем. Вот как происходит превращение объекта "ссылка" в объект определенного класса:

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) к атрибуту 'name' ("имя") и метод для изменения его значения (modifier).

sub say_name { # метод доступа (accessor) к атрибуту name my ($self) = @_; # получить ссылку на объект return $self->{name}; # вернуть значение атрибута }




Содержание  Назад  Вперед