- ·上一篇文章:Perl Socket 编程
- ·下一篇文章:Perl 数据库连接
Perl 面向对象
名为 :
$firstName\n";执行以上程序后,输出结果为:$ perl main.pl名字:小明姓氏:王编号:23234345这是子类函数设置前姓名为 :
小明这是子类函数设置后姓名为 :
小强默认载入如果在当前类、当前类所有的基类、还有 UNIVERSAL 类中都找不到请求的方法,这时会再次查找名为 AUTOLOAD() 的一个方法。如果找到了 AUTOLOAD,那么就会调用,同时设定全局变量 $AUTOLOAD 的值为缺失的方法的全限定名称。如果还不行,那么 Perl 就宣告失败并出错。如果你不想继承基类的 AUTOLOAD,很简单,只需要一句:sub AUTOLOAD;析构函数及垃圾回收当对象的最后一个引用释放时,对象会自动析构。如果你想在析构的时候做些什么,那么你可以在类中定义一个名为"DESTROY"的方法。它将在适合的时机自动调用,并且按照你的意思执行额外的清理动作。package MyClass;...sub DESTROY{ print "MyClass:
:
DESTROY called\n";}Perl 会把对象的引用作为唯一的参数传递给 DESTROY。注意这个引用是只读的,也就是说你不能通过访问$_[0] 来修改它。(译者注:参见 perlsub)但是对象自身(比如 "${$_[0]"或者 "@{$_[0]}" 还有 "%{$_[0]}" 等等)还是可写的。如果你在析构器返回之前重新 bless 了对象引用,那么 Perl 会在析构器返回之后接着调用你重新 bless 的那个对象的 DESTROY 方法。这可以让你有机会调用基类或者你指定的其它类的析构器。需要说明的是,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 calledMyClass:
:
MyMethod called!调用 MySubClass 方法MySubClass:
:
new calledMyClass:
:
new calledMyClass:
:
MyMethod called! MySubClass:
:
MyMethod called!创建一个作用域对象MyClass:
:
new calledMyClass:
:
DESTROY called创建对象MyClass:
:
new calledMyClass:
:
DESTROY called脚本执行结束...MyClass:
:
DESTROY calledMySubClass:
:
DESTROY called
$firstName\n";执行以上程序后,输出结果为:$ perl main.pl名字:小明姓氏:王编号:23234345这是子类函数设置前姓名为 :
小明这是子类函数设置后姓名为 :
小强默认载入如果在当前类、当前类所有的基类、还有 UNIVERSAL 类中都找不到请求的方法,这时会再次查找名为 AUTOLOAD() 的一个方法。如果找到了 AUTOLOAD,那么就会调用,同时设定全局变量 $AUTOLOAD 的值为缺失的方法的全限定名称。如果还不行,那么 Perl 就宣告失败并出错。如果你不想继承基类的 AUTOLOAD,很简单,只需要一句:sub AUTOLOAD;析构函数及垃圾回收当对象的最后一个引用释放时,对象会自动析构。如果你想在析构的时候做些什么,那么你可以在类中定义一个名为"DESTROY"的方法。它将在适合的时机自动调用,并且按照你的意思执行额外的清理动作。package MyClass;...sub DESTROY{ print "MyClass:
:
DESTROY called\n";}Perl 会把对象的引用作为唯一的参数传递给 DESTROY。注意这个引用是只读的,也就是说你不能通过访问$_[0] 来修改它。(译者注:参见 perlsub)但是对象自身(比如 "${$_[0]"或者 "@{$_[0]}" 还有 "%{$_[0]}" 等等)还是可写的。如果你在析构器返回之前重新 bless 了对象引用,那么 Perl 会在析构器返回之后接着调用你重新 bless 的那个对象的 DESTROY 方法。这可以让你有机会调用基类或者你指定的其它类的析构器。需要说明的是,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 calledMyClass:
:
MyMethod called!调用 MySubClass 方法MySubClass:
:
new calledMyClass:
:
new calledMyClass:
:
MyMethod called! MySubClass:
:
MyMethod called!创建一个作用域对象MyClass:
:
new calledMyClass:
:
DESTROY called创建对象MyClass:
:
new calledMyClass:
:
DESTROY called脚本执行结束...MyClass:
:
DESTROY calledMySubClass:
:
DESTROY called
Perl 面向对象