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



         

Классы и объекты - часть 3


Объект в Perl представляет собой просто ссылку, но не любую, а связанную с определенным классом. Тип ссылки можно определить при помощи функции ref EXPR, которая, рассматривая свой аргумент как ссылку, возвращает символическое обозначение ее типа. Для встроенных типов Perl используются следующие символические обозначения:

  • REF — ссылка на ссылку;
  • SCALAR — ссылка на скаляр;
  • ARRAY — ссылка на массив;
  • HASH — ссылка на ассоциативный массив;
  • CODE — ссылка на подпрограмму;
  • GLOB — ссылка на переменную типа typegiob.
  • Для ссылки-объекта функция ref () возвращает имя класса, к которому этот объект принадлежит. Обычная ссылка становится объектом после ее "посвящения" в члены класса при помощи функции

    bless REF [, CLASSNAME]

    Слово "bless" в английском языке имеет значение "освящать, благословлять". В данном контексте его можно перевести как "посвящать" или "санкционировать". Функция bless REF санкционирует принадлежность субъекта ссылки REF к классу CLASSNAME. Она возвращает ссылку на этот субъект, но уже другого типа — CLASSNAME (напомним, что в главе 9 субъектом ссылки мы условились называть то, на что она указывает, т. е. собственно структуру данных некоторого типа). Она связывает обычную ссылку с именем класса. Если имя класса не задано, то используется имя текущего класса. После выполнения функции bless ок созданному ей объекту можно обращаться, используя его квалифицированное имя $CLASSNAME: :REF. Сказанное иллюстрируется следующим примером.

    $h = { }; •

    print("тип переменной \$h - ". ref($h), "\n");

    bless($h, "MyClass");

    print("тип переменной \$h - ". ref($h), "\n");

    В результате будет выведен тип переменной $ref до и после вызова функции bless ():

    тип переменной $h — HASH тип переменной $h — MyClass

    Наследование в Perl отличается от наследования в других объектно-ориентированных языках программирования тем, что наследуются только методы. Наследование данных реализуется программистом самостоятельно. Наследование методов реализовано следующим образом. С каждым пакетом ассоциирован свой специальный массив @ISA, в котором хранится список базовых классов данного пакета. Таким образом, подкласс располагает информацией о своих базовых классах. Если внутри текущего класса встречается обращение к методу, не определенному в самом классе, то интерпретатор в поисках отсутствующего метода просматривает классы в том порядке, в котором они встречаются в массиве @ISA. Затем просматривается предопределенный класс UNIVERSAL. В нем изначально нет никаких явных определений, но автоматически содержатся некоторые общие методы, которые неявно наследуются всеми классами. В этом смысле класс UNIVERSAL можно считать базовым классом всех остальных классов.

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

    $AUTOLOAD.

     




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