赞助广告 赞助广告
  当前位置:网络学院图形图像作品欣赏 → Perl的面向对象编程(二)
Perl的面向对象编程(二)
日期:2001年7月17日 作者:不详 人气: 查看:[大字体 中字体 小字体]
四、构造函数
  构造函数是类的子程序,它返回与类名相关的一个引用。将类名与引用相结合称为“祝福”一个对象,因为建立该结合的函数名为bless(),其语法为:
  bless YeReference [,classname]
  YeReference是对被“祝福”的对象的引用,classname是可选项,指定对象获取方法的包名,其缺省值为当前包名。
  创建一个构建函数的方法为返回已与该类结合的内部结构的引用,如:


sub new {
my $this = {}; # Create an anonymous hash, and #self points to it.
bless $this; # Connect the hash to the package Cocoa.
return $this; # Return the reference to the hash.
}

1;

  {}创建一个对不含键/值对的哈希表(即关联数组)的引用,返回值被赋给局域变量$this。函数bless()取出该引用,告诉对象它引用的是Cocoa,最后返回该引用。函数的返回值现在指向这个匿名哈希表。
  从new()函数返回后,$this引用被销毁,但调用函数保存了对该哈希表的引用,因此该哈希表的引用数不会为零,从而使Perl在内存中保存该哈希表。创建对象可如下调用:
  $cup = new Cocoa;
  下面语句为使用该包创建对象的例子:


1 #!/usr/bin/perl
2 push (@INC,"pwd");
3 use Cocoa;
4 $cup = new Cocoa;

  第一行指出Perl解释器的位置,第二行中,将当前目录加到路径寻找列表@INC中供寻找包时使用。你也可以在不同的目录中创建你的模块并指出该绝对路径。例如,如果在/home/test/scripts/创建包,第二行就应该如下:
  push (@INC , "/home/test/scripts");
  在第三行中,包含上包Cocoa.pm以获取脚本中所需功能。use语句告诉Perl在@INC路径寻找文件Cocoa.pm并包含到解析的源文件拷贝中。use语句是使用类必须的。第四行调用new函数创建对象,这是Perl的妙处,也是其易混淆之处,也是其强大之处。创建对象的方法有多种,可以这样写:
  $cup = cocoa->new();
  如果你是C程序员,可以用双冒号强制使用Cocoa包中的new()函数,如:
  $cup = Cocoa::new();
  可以在构造函数中加入更多的代码,如在Cocoa.pm中,可以在每个对象创建时输出一个简单声明,还可以用构造函数初始化变量或设置数组或指针。
注意:

1、一定要在构造函数中初始化变量;
2、一定要用my函数在方法中创建变量;
3、一定不要在方法中使用local,除非真的想把变量传递给其它子程序;
4、一定不要在类模块中使用全局变量。

  加上声明的Cocoa构造函数如下:


sub new {
my $this = {};
print "
/*
** Created by Cocoa.pm
** Use at own risk";
print "
** Did this code even get pass the javac compiler? ";
print "
**/
";
bless $this;
return $this;
}

  也可以简单地调用包内或包外的其它函数来做更多的初始化工作,如:


sub new {
my $this = {}
bless $this;
$this->doInitialization();
return $this;
}

  创建类时,应该允许它可被继承,应该可以把类名作为第一个参数来调用new函数,那么new函数就象下面的语句:


sub new {
my $class = shift; # Get the request class name
my $this = {};
bless $this, $class # Use class name to bless() reference
$this->doInitialization(); return $this;
}

  此方法使用户可以下列三种方式之一来进行调用:


Cocoa::new()
Cocoa->new()
new Cocoa
  可以多次bless一个引用对象,然而,新的将被bless的类必然把对象已被bless的引用去掉,对C和Pascal程序员来说,这就象把一个指针赋给分配的一块内存,再把同一指针赋给另一块内存而不释放掉前一块内存。总之,一个Perl对象每一时刻只能属于一个类。
  对象和引用的真正区别是什么呢?Perl对象被bless以属于某类,引用则不然,如果引用被bless,它将属于一个类,也便成了对象。对象知道自己属于哪个类,引用则不属于任何类。

实例变量

  作为构造函数的new()函数的参数叫做实例变量。实例变量在创建对象的每个实例时用于初始化,例如可以用new()函数为对象的每个实例起个名字。
  可以用匿名哈希表或匿名数组来保存实例变量。
  用哈希表的代码如下:


sub new {

my $type = shift;
my %parm = @_;
my $this = {};
$this->{"Name"} = $parm{"Name"};
$this->{"x"} = $parm{"x"};
$this->{"y"} = $parm{"y"};
bless $this, $type;

}

  用数组保存的代码如下:


sub new {

my $type = shift;
my %parm = @_;
my $this = [];
$this->[0] = $parm{"Name"};
$this->[1] = $parm{"x"};
$this->[2] = $parm{"y"};
bless $this, $type;

}

  构造对象时,可以如下传递参数:
  $mug = Cocoa::new( "Name" => "top","x" => 10,"y" => 20 );
  操作符=>与逗号操作服功能相同,但=>可读性好。访问方法如下:
  print "Name=$mug->{"Name"}
";
  print "x=$mug->{"x"}
";
  print "y=$mug->{"y"}
";

(出处:不详 )

相关文章:
 
·ASP实现文件在线压缩和解压缩
·网际快车FlashGet使用技巧荟萃
·一个天气预报的小偷
·Are you ready?
·ASP简介
·ASP基础
·ASP脚本基础
·ASP脚本变量、函数、过程和条件语句
·乔客论坛惊暴UPfile严重漏洞!
·ASP脚本循环语句
相关软件:
 
·动感下载系统 2.0(access版)k170美化版带天空华军小偷
·风韵设计综合娱乐网 v4.0 功能增强完美版
·Boai BLBS V1000
·Boai BLBS V3.3
·中国龙BlogVer 1.1.0MX版
·中国大学生设计网 全站程序第三版
·518主机域名在线管理平台 v1.5
·Zend StudioClient V3.5.1 特别版
·Zend Studio Client for Linux V3.5.1 特别版
·PHP v4.3.9 RC1
  特别推荐
  热点TOP10