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

Обобщающий пример

В данном примере определен пакет main и два класса: staff и Graduate, staff является базовым классом Graduate.

Наследование методов задается при помощи массива @ISA, ассоциированного с производным классом Graduate. Помимо наследования методов, которое обеспечивает Perl, организовано наследование переменных, объекта через вызов в конструкторе класса Graduate конструктора базового класса staff. В результате объект класса Graduate получает при создании переменную объекта staff (параметр, переданный конструктору new), которую изменяет, добавляя в соответствующий хеш-массив новый элемент с ключом "образование" и значением "высшее".

Ситуация, когда конструктор производного класса вызывает конструктор базового, также обсуждалась в разделе 12. В подобном случае при удалении объекта автоматически вызывается только деструктор производного класса, хотя при вызове конструктора последовательно создавались объекты двух классов. В примере деструктор DESTROY класса Graduate вызывает деструктор базового класса. В данном случае это совершенно не обязательно, так как оба деструктора просто выводят сообщения об удалении своих объектов, но ведь это только модель. В иной ситуации такое решение может быть необходимым.

Следующая тема связана с поиском несуществующего метода, к которому происходит обращение внутри класса, и применением в этом случае функции AUTOLOAD. В пакете main вызывается метод getdata. для объекта $someone. $someone является объектом Класса Graduate, в котором метод getdata не определен. Обратите внимание на форму вызова метода getdata. Если бы он был вызван в виде getdata ($someone), это означало, что вызывается функция getdata из пакета main с параметром $someone. Поскольку в пакете main такая функция не определена, выполнение программы было бы завершено с выдачей сообщения вида:

Undefined subroutine Smain::getdata called at…

Форма обращения $someone › getdata однозначно определяет, что вызывается не функция, а метод объекта. Следовательно, его надо искать сначала в собственном классе Graduate, а затем в классе staff, который определен в качестве базового для Graduate. В классе staff метод getdata также не определен, но определена функция AUTOLOAD, которая и вызывается вместо этого метода.

Полиморфизм, т. е. переопределение методов базового объекта, показан на примере метода showdata. Класс staff служит для порождения анкетных форм учета персонала. Его подкласс Graduate описывает подмножество таких форм только для лиц с высшим образованием. Конструктор класса Graduate автоматически добавляет в форму запись о наличии высшего образования. Метод showdata, наследованный у базового класса, изменен таким образом, чтобы игнорировать анкеты без такой записи. Поэтому информация об объекте $ somebody, принадлежащем к базовому классу, напечатана не будет.

В результате выполнения примера будут выведены строки, соответствующие действиям, заданным в программе:

имя › Николай образование › высшее фамилия › Кузнецов
пакет Staff: отсутствует функция
Graduate::getdata
Удаляется объект класса Staff
Удаляется объект класса Graduate
Удаляется объект класса Staff.
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.