Шаг 141.
Конструкторы

    На этом шаге мы рассмотрим создание и использование конструкторов.

    Конструктор - это просто подпрограмма, возвращающая ссылку. Обычно (но не обязательно) конструктор имеет имя new. Ранее мы говорили, что объект является ссылкой. Конструктор, создающий объект, то есть ссылку, тоже возвращает ссылку. О каких ссылках идет речь, на что они указывают? Рассмотрим простой пример.

package MyClass; 
sub new 
{
  my $class = shift;
  my $self = {};
  bless $self, $class; 
  return $self;
}

    В операторе my $seif = {} создается ссылка на анонимный хеш-массив, первоначально пустой, которая сохраняется в локальной переменной $self. Функция bless() "сообщает" субъекту ссылки $self, то есть анонимному хеш-массиву, что он отныне является объектом класса MyClass, и возвращает ссылку на этот объект. Затем ссылка на новый объект класса MyClass возвращается в качестве значения конструктора new(). Обратите внимание на следующие обстоятельства.

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

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

    В-третьих, конструктору, создающему объект, в качестве первого аргумента передается имя класса этого объекта.

#! perl -w
#Модуль класса Staff.pm: 
package Staff; 
require Exporter; 
@ISA = qw (Exporter);
@EXPORT = qw (new); 
sub new 
{
  my ($class, @items) = shift;
  my $self = {};
  bless $self, $class;
  return $self;
}

    Основная программа:

#! perl -w
use Staff;
$someone=new(Staff);
${$someone}{"имя"} ="Александр";
${$someone}{"фамилия"}="Александров";
${$someone}{"возраст"}="37"; 
for $i (sort keys %{$someone})
{ 
  print "$i=>$$someone{$i}\n";
}
Текст этого примера можно взять здесь.

    В данном примере класс staff служит для представления анкетных данных. В качестве внутренней структуры для представления объекта наилучшим образом подходит хеш-массив, так как в него при необходимости можно добавлять новые элементы с произвольно заданными ключами, например, "имя", "фамилия", "образование" и т. д. Класс оформлен в виде отдельного модуля, способного управлять экспортом своих методов. Чтобы конструктор new() можно было вызвать в основной программе, он включен в файл экспорта @EXPORT. В результате вызова конструктора возвращается ссылка на объект класса. Значения элементов хеш-массива выводятся:


Рис.1. Результат работы скрипта

    На следующем шаге мы рассмотрим методы класса и методы объекта.




Предыдущий шаг Содержание Следующий шаг