Иллюстрированный самоучитель по Perl



         

Методы класса и методы объекта - часть 2


package Staff;

require Exporter;

@ISA = qw(Exporter);

8EXPORT = qw(new showdata setdata);

sub new {

my ($class, $data) = @_;

my $self = $data;

bless $self, $class;

return $self; } sub showdata {

my $self = shift;

my @keys = @_ ? @_ : sort keys %$self;

foreach $key (@keys) {

print "\t$key => $self->{$key}\n";

}

return $self;

}

sub setdata {

my ($self,$data) = @_; for $i (keys %$data) {

$self->{$i)=$data->{$i);

}

return $self;

}

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

Если обратиться к основной программе:

#!/usr/bin/peri

use Staff;

$someone=new(Staff, ("имя"=>"","фамилия"=>""});

setdata($someone,{"имя"=>"Максим","фамилия"=>"Исаев",

"возраст"=>42,"занятия спортом"=>"теннис"}); showdata($someone);

то будут выведены следующие данные:

возраст => 42

занятия спортом => теннис

имя => Максим

фамилия => Исаев

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




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