Latest web development tutorials

Perl объектно-ориентированного

Есть два различных Perl для реализации объектно-ориентированного программирования:

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

Основные понятия объектно-ориентированного

Есть много основных понятий объектно-ориентированного, где мы получили три: объекты, классы и методы.

  • Объект: Объект представляет собой эталонные класс данных.,

  • Класс: Класс представляет собой пакет Perl, который содержит объект , чтобы обеспечить способ класса.

  • Методы: Метод является подпрограмма Perl, имя класса является его первый аргумент.

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


определение класса

Класс является только простой пакет.

Вы можете использовать пакет как класс, и положил сумку в зависимости от метода класса использования.

Пакет Perl предоставляет отдельное пространство имен, метод различных пакетов и имена переменных не конфликтуют.

Perl файл классы расширений для .pm.

Далее мы создаем класс Person:

package Person;

Диапазон кодов класса до последней строки файла сценария, или к пакету до следующего ключевого слова.


Создание и использование объектов

Создайте экземпляр класса (объект), нам нужно определить конструктор, большинство программ используют имя класса в качестве конструктора, Perl можно использовать любое имя.

Вы можете использовать различные переменные, как объект Perl Perl. В большинстве случаев мы будем использовать массив или хэш-ссылку.

Далее мы создаем конструктор для класса Person, использовать хэш-ссылку на Perl.

При создании объекта, необходимо предоставить конструктор, который представляет собой подпрограмму, которая возвращает ссылку на объект.

Примерами могут служить следующие:

package Person;
sub new
{
    my $class = shift;
    my $self = {
        _firstName => shift,
        _lastName  => shift,
        _ssn       => shift,
    };
    # 输出用户信息
    print "名字:$self->{_firstName}\n";
    print "姓氏:$self->{_lastName}\n";
    print "编号:$self->{_ssn}\n";
    bless $self, $class;
    return $self;
}

Далее мы создаем объект:

$object = new Person( "小明", "王", 23234345);

метод определения

только методы Perl класса, но это подпрограмма на Perl, также известный в качестве функции члена.

Объектно-ориентированный Perl Perl определение метода не предусматривает какого-либо специального синтаксиса, но первый параметр определяет метод для упомянутого объекта или пакета.

Perl не предоставляет частные переменные, но мы можем управлять данными объекта через вспомогательный путь.

Затем мы определяем способ получить имя:

sub getFirstName {
    return $self->{_firstName};
}

То же самое можно также написать:

sub setFirstName {
    my ( $self, $firstName ) = @_;
    $self->{_firstName} = $firstName if defined($firstName);
    return $self->{_firstName};
}

Далее, мы изменим файл Person.pm кода, следующим образом:

#!/usr/bin/perl 

package Person;

sub new
{
    my $class = shift;
    my $self = {
        _firstName => shift,
        _lastName  => shift,
        _ssn       => shift,
    };
    # 输出用户信息
    print "名字:$self->{_firstName}\n";
    print "姓氏:$self->{_lastName}\n";
    print "编号:$self->{_ssn}\n";
    bless $self, $class;
    return $self;
}
sub setFirstName {
    my ( $self, $firstName ) = @_;
    $self->{_firstName} = $firstName if defined($firstName);
    return $self->{_firstName};
}

sub getFirstName {
    my( $self ) = @_;
    return $self->{_firstName};
}
1;

employee.pl код сценария выглядит следующим образом:

#!/usr/bin/perl

use Person;

$object = new Person( "小明", "王", 23234345);
# 获取姓名
$firstName = $object->getFirstName();

print "设置前姓名为 : $firstName\n";

# 使用辅助函数设置姓名
$object->setFirstName( "小强" );

# 通过辅助函数获取姓名
$firstName = $object->getFirstName();
print "设置后姓名为 : $firstName\n";

После выполнения вышеуказанной программы, выход:

$ perl employee.pl
名字:小明
姓氏:王
编号:23234345
设置前姓名为 : 小明
设置后姓名为 : 小强

унаследовать

Методы Perl класса в наследовании по @ISA массива, массив, который содержит имя и другие пакеты (класс), наследуют переменную должен быть явно установлен.

Множественное наследование является массив @ISA, содержащий множество имени класса (пакет).

Метод может быть унаследован только через @ISA, данные не могут быть унаследованы.

Далее мы создаем класс Employee наследует класс Person.

Код Employee.pm файла выглядит следующим образом:

#!/usr/bin/perl

package Employee;
use Person;
use strict;
our @ISA = qw(Person);    # 从 Person 继承

Теперь класс Employee содержит все методы и свойства класса Person, мы вводим следующий код в файле main.pl и выполните следующую команду:

#!/usr/bin/perl

use Employee;

$object = new Employee( "小明", "王", 23234345);
# 获取姓名
$firstName = $object->getFirstName();

print "设置前姓名为 : $firstName\n";

# 使用辅助函数设置姓名
$object->setFirstName( "小强" );

# 通过辅助函数获取姓名
$firstName = $object->getFirstName();
print "设置后姓名为 : $firstName\n";

После выполнения вышеуказанной программы, выход:

$ perl main.pl
名字:小明
姓氏:王
编号:23234345
设置前姓名为 : 小明
设置后姓名为 : 小强

метод переопределяет

В приведенном выше примере, класс Сотрудник расширяет класс Person, но если методы класса Person не может удовлетворить спрос, необходимо переписать свои методы.

Далее, мы добавим некоторые новые методы в классе Employee, и переопределить методы класса Person:

#!/usr/bin/perl

package Employee;
use Person;
use strict;
our @ISA = qw(Person);    # 从 Person 继承

# 重写构造函数
sub new {
    my ($class) = @_;

    # 调用父类的构造函数
    my $self = $class->SUPER::new( $_[1], $_[2], $_[3] );
    # 添加更多属性
    $self->{_id}   = undef;
    $self->{_title} = undef;
    bless $self, $class;
    return $self;
}

# 重写方法
sub getFirstName {
    my( $self ) = @_;
    # 这是子类函数
    print "这是子类函数\n";
    return $self->{_firstName};
}

# 添加方法
sub setLastName{
    my ( $self, $lastName ) = @_;
    $self->{_lastName} = $lastName if defined($lastName);
    return $self->{_lastName};
}

sub getLastName {
    my( $self ) = @_;
    return $self->{_lastName};
}

1;

Мы входим в следующий код main.pl файл и выполните команду:

#!/usr/bin/perl

use Employee;

$object = new Employee( "小明", "王", 23234345);
# 获取姓名,使用修改后的构造函数
$firstName = $object->getFirstName();

print "设置前姓名为 : $firstName\n";

# 使用辅助函数设置姓名
$object->setFirstName( "小强" );

# 通过辅助函数获取姓名
$firstName = $object->getFirstName();
print "设置后姓名为 : $firstName\n";

После выполнения вышеуказанной программы, выход:

$ perl main.pl
名字:小明
姓氏:王
编号:23234345
这是子类函数
设置前姓名为 : 小明
这是子类函数
设置后姓名为 : 小强

Загрузка по умолчанию

Если класс в ток, текущий класс всех базового класса и методы класса УНИВЕРСАЛЬНЫЙ запрошенных не может быть найден, то ищет метод с именем AutoLoad снова (). Если найден AutoLoad, он будет звонить, в то время как установка полное имя глобальной переменной значение $ AUTOLOAD недостающих методов.

Если нет, то он не Perl и ошибок.

Если вы не хотите, чтобы наследовать базовый класс автозагрузку, очень просто, только одно предложение:

sub AUTOLOAD;

Деструкторы и вывоз мусора

Когда последняя ссылка на объект освобождается, объект автоматически уничтожается.

Если вы хотите сделать что-то в деструкторе, когда вы можете метод, называемый "Destroy" определяется в классе. Он будет автоматически вызывать соответствующее время, а также для выполнения дополнительных действий по очистке в соответствии с тем, что вы имеете в виду.

package MyClass;
...
sub DESTROY
{
    print "MyClass::DESTROY called\n";
}

ссылка на объект Perl будет передан УНИЧТОЖИТЬ в качестве единственного параметра. Обратите внимание, что эта цитата только для чтения, что означает, что вы не можете получить доступ к $ _ [0], чтобы изменить его. (Примечание переводчика: См perlsub), но сам объект (например, "$ {$ _ [0]" или "@ {$ _ [0]}" и "% {$ _ [0]}", и т.д.) или может быть написано.

Если вы повторно благословить ссылку на объект до возвращения деструкторов, Perl будет называть вас повторно благословить УНИЧТОЖИТЬ метод этого объекта после возвращения деструкторов. Это позволяет иметь возможность вызывать базовый класс или указать деструктора другие классы. Следует отметить, DESTROY также может быть осуществлен вручную, но, как правило, нет необходимости.

После выхода текущего объекта, другие объекты, содержащиеся в текущем объекте автоматически освобождается.


Примеры объектно-ориентированного Perl

Мы можем быть более понятны из следующих объектно-ориентированных приложений примеры Perl:

#!/usr/bin/perl

# 下面是简单的类实现
package MyClass;

sub new
{
   print "MyClass::new called\n";
   my $type = shift;            # 包名
   my $self = {};               # 引用空哈希
   return bless $self, $type;   
}

sub DESTROY
{
   print "MyClass::DESTROY called\n";
}

sub MyMethod
{
   print "MyClass::MyMethod called!\n";
}


# 继承实现
package MySubClass;

@ISA = qw( MyClass );

sub new
{
   print "MySubClass::new called\n";
   my $type = shift;            # 包名
   my $self = MyClass->new;     # 引用空哈希
   return bless $self, $type;  
}

sub DESTROY
{
   print "MySubClass::DESTROY called\n";
}

sub MyMethod
{
   my $self = shift;
   $self->SUPER::MyMethod();
   print "   MySubClass::MyMethod called!\n";
}

# 调用以上类的主程序
package main;

print "调用 MyClass 方法\n";

$myObject = MyClass->new();
$myObject->MyMethod();

print "调用 MySubClass 方法\n";

$myObject2 = MySubClass->new();
$myObject2->MyMethod();

print "创建一个作用域对象\n";
{
  my $myObject2 = MyClass->new();
}
# 自动调用析构函数

print "创建对象\n";
$myObject3 = MyClass->new();
undef $myObject3;

print "脚本执行结束...\n";
# 自动执行析构函数

Вышеприведенная программа, выход:

调用 MyClass 方法
MyClass::new called
MyClass::MyMethod called!
调用 MySubClass 方法
MySubClass::new called
MyClass::new called
MyClass::MyMethod called!
   MySubClass::MyMethod called!
创建一个作用域对象
MyClass::new called
MyClass::DESTROY called
创建对象
MyClass::new called
MyClass::DESTROY called
脚本执行结束...
MyClass::DESTROY called
MySubClass::DESTROY called