В Perl существуют две разные реализации объектно-ориентированного программирования:
Один из них основан на методе анонимной хэш-таблицы. Суть каждого экземпляра объекта — это ссылка, указывающая на анонимную хеш-таблицу. В этой анонимной хэш-таблице хранятся все атрибуты экземпляра.
Второй — метод на основе массива. При определении класса мы создадим массив для каждого атрибута экземпляра, а суть каждого экземпляра объекта — это ссылка, указывающая на индекс строки в этих массивах. В этих массивах хранятся все свойства экземпляра.
В объектно-ориентированном языке существует множество основных понятий, здесь мы принимаем три: объекты, классы и методы.
Объект : Объект — это ссылка на элемент данных в классе. .
Класс : Класс — это пакет Perl, содержащий классы, предоставляющие методы объекта.
Метод : метод представляет собой подпрограмму Perl, а имя класса является ее первым параметром.
Perl предоставляет функцию bless(). Bless используется для создания объектов. Bless связывает ссылку с именем класса и создает объект, возвращая ссылку.
Класс — это простой пакет.
Вы можете использовать пакет как класс, а функции пакета — как методы класса.
Пакеты Perl предоставляют независимые пространства имен, поэтому имена методов и переменных в разных пакетах не будут конфликтовать.
Расширение файлов классов Perl — .pm.
Далее мы создаем класс Person:
пакет Человек;
Диапазон кода класса достигает последней строки файла сценария или перед следующим ключевым словом пакета.
Чтобы создать экземпляр (объект) класса, нам нужно определить конструктор. Большинство программ используют имя класса в качестве конструктора, но в Perl вы можете использовать любое имя.
В качестве объектов Perl можно использовать различные переменные Perl. Большую часть времени мы будем использовать ссылочные массивы или хеши.
Затем мы создаем конструктор для класса Person, используя ссылку на хэш Perl.
При создании объекта вам необходимо предоставить конструктор, который представляет собой подпрограмму, возвращающую ссылку на объект.
Примеры следующие:
Далее создаем объект:
$object = new Person( "Сяо Мин", "王", 23234345);
Метод класса Perl — это просто подпрограмма Perl, известная как функция-член.
Определение метода Perl в объектно-ориентированном Perl не предоставляет никакого специального синтаксиса, но предусматривает, что первым параметром метода является объект или пакет, на который он ссылается.
Perl не предоставляет частных переменных, но мы можем управлять данными объекта с помощью вспомогательных методов.
Далее мы определяем метод для получения имени:
sub getFirstName { return $self->{_firstName};}
Вы также можете написать так:
sub setFirstName {my ($self, $firstName) = @_; $self->{_firstName} = $firstName, если определено ($firstName); return $self->{_firstName};}
Далее мы модифицируем код файла Person.pm следующим образом:
Код сценария сотрудника.pl выглядит следующим образом:
После выполнения вышеуказанной программы результат вывода:
$ perl сотрудник.pl Имя: Сяо Мин Фамилия: Ван Номер: 23234345 Имя до настройки: Сяо Мин Имя после настройки: Сяо Цян
Методы классов в Perl наследуются через массив @ISA. Этот массив содержит имена других пакетов (классов). Наследование переменных должно быть задано явно.
Множественное наследование означает, что массив @ISA содержит несколько имен классов (пакетов).
Через @ISA можно наследовать только методы, а не данные.
Затем мы создаем класс «Сотрудник», который наследует класс «Человек».
Код файла «Сотрудник.pm» выглядит следующим образом:
Теперь класс «Сотрудник» содержит все методы и свойства класса «Человек». Мы вводим следующий код в файл main.pl и выполняем его:
После выполнения вышеуказанной программы результат вывода:
$ perl main.pl Имя: Сяо Мин Фамилия: Ван Номер: 23234345 Имя до настройки: Сяо Мин Имя после настройки: Сяо Цян
В приведенном выше примере класс «Сотрудник» наследует класс «Человек», но если методы класса «Человек» не могут удовлетворить потребности, его методы необходимо переписать.
Затем мы добавим несколько новых методов в класс «Сотрудник» и переопределим методы класса «Человек»:
Вводим следующий код в файл main.pl и выполняем его:
После выполнения вышеуказанной программы результат вывода:
$ perl main.pl Имя: Сяо Мин Фамилия: Ван Номер: 23234345 Это имя функции подкласса до установки: Сяо Мин Это имя функции подкласса после установки: Сяоцян
Если запрошенный метод не найден в текущем классе, во всех базовых классах текущего класса и классе UNIVERSAL, снова выполняется поиск метода с именем AUTOLOAD(). Если AUTOLOAD найден, он вызывается, и глобальной переменной $AUTOLOAD присваивается полное имя отсутствующего метода.
Если это не сработает, Perl завершится с ошибкой.
Если вы не хотите наследовать AUTOLOAD базового класса, это очень просто, всего одно предложение:
суб АВТОЗАГРУЗКА;
Объект автоматически уничтожается при освобождении последней ссылки на объект.
Если вы хотите что-то сделать во время разрушения, вы можете определить в классе метод с именем «DESTROY». Он будет автоматически вызываться в нужный момент и выполнять дополнительные действия по очистке по вашему желанию.
package MyClass;...sub DESTROY{ print "MyClass::DESTROY calln";}
Perl передаст ссылку на объект в качестве единственного параметра функции DESTROY. Обратите внимание, что эта ссылка доступна только для чтения, что означает, что вы не можете изменить ее, обратившись к $_[0]. (Примечание переводчика: см. perlsub). Но сам объект (например, «${$_[0]» или «@{$_[0]}» и «%{$_[0]}» и т. д.) может все еще быть Написанным.
Если вы повторно благословите ссылку на объект до того, как деструктор вернется, Perl вызовет метод DESTROY объекта, который вы повторно благословили, после возвращения деструктора. Это дает вам возможность вызвать деструктор базового класса или других указанных вами классов. Следует отметить, что DESTROY также можно вызвать вручную, но обычно в этом нет необходимости.
После освобождения текущего объекта другие объекты, содержащиеся в текущем объекте, будут освобождены автоматически.
Мы можем лучше понять объектно-ориентированное применение Perl на следующих примерах:
Результат выполнения вышеуказанной программы:
Вызовите метод MyClass MyClass::new вызванныйMyClass::MyMethod Вызовите метод MySubClass MySubClass::new вызванныйMyClass::new вызванныйMyClass::MyMethod вызванный! вызывается Создать объект MyClass::new вызываетсяMyClass::DESTROY выполнение вызванного скрипта заканчивается...MyClass::DESTROY вызванныйMySubClass::DESTROY