С каждым пакетом ассоциирован свой собственный массив @ISA. В массиве хранится список базовых классов для данного пакета.
Как используется массив @ISA ?
Если внутри текущего класса встречается обращение к несуществующему методу, интерпретатор
начнет просматривать перечисленные в @ISA классы, надеясь найти запрашиваемый метод в них. Классы будут просматриваться в том порядке, как они определены в массиве @ISA.
Если метод и там не найден, интерпретатор обратится к предопределенному классу UNIVERSAL. UNIVERSAL - это базовый класс для всех классов, наследуется автоматически.
Если и там метода не обнаружено, несчастный интерпретатор начнет поиск подпрограммы AUTOLOAD в текущем классе, затем в перечисленных родительских классах.
Если подпрограмма найдена - она будет выполнена вместо запрашиваемого метода, с теми же параметрами. Если подпрограмма не найдена - интерпретатор вернет ошибку.
Пример:
|
1 2 3 4 5 6 |
#!/usr/local/bin/perl use Pack; @ISA = qw(Pack); print join(" ", @ISA); # выведет 'Pack' |
Или так:
|
1 2 3 |
use base qw(Pack); print join(" ", @ISA); # выведет 'Pack' |
use base;
Для удобства работы с массивом @ISA, используется модуль прагмы - base. Прагма позволяет вовремя определить родительские классы для текущего класса.
Запись:
|
1 |
use base qw( BaseClass1 BaseClass2 ); |
примерно эквивалентна коду:
|
1 2 3 4 5 6 |
BEGIN { require BaseClass1; require BaseClass2; push @ISA, qw( BaseClass1 BaseClass2 ); } |