加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

perl面向对象

发布时间:2020-12-15 23:45:20 所属栏目:大数据 来源:网络整理
导读:Perl面向对象 转载: http://www.cnblogs.com/itech/archive/2012/08/21/2649580.html 首先让我们来看看有关 Perl 面向对象编程的三个基本定义: ? ? 1. ?一个“对象”是指一个“有办法知道它是属于哪个类”的简单引用。(对象就是引用变量) ? ? 2. ?一个“类
Perl面向对象

转载: http://www.cnblogs.com/itech/archive/2012/08/21/2649580.html
首先让我们来看看有关 Perl 面向对象编程的三个基本定义:
? ? 1. ?一个“对象”是指一个“有办法知道它是属于哪个类”的简单引用。(对象就是引用变量)
? ? 2. ?一个“类”是指一个“有办法给属于它的对象提供一些方法”的简单的包。(类就是包)
? ? 3. ?一个“方法”是指一个“接受一个对象或者类名称作为第一个参数”的简单的子程序。(类的方法就是第一个参数为类名或对象的方法)
?
一个类只是一个简单的包
和 C++ 不同,Perl 并不为类定义提供任何特殊语法。实际上类只是一个包而已。你可以把一个包当作一个类用,并且把包里的函数当作类的方法来用。不过,有一个特殊的数组,叫做 @ISA,它说明了“当 Perl 在当前包中找不到想要的方法时,应当继续从哪儿去找”。这就是 Perl 实现“继承”的关键。@ISA中的每个元素都是一个别的包的名字。当类找不到方法时,它会从 @ISA 数组中依次寻找(深度优先)。类通过访问 @ISA 来知道哪些类是它的基类。
所有的类都有一个隐含的基类(祖先类):"UNIVERSAL"。"UNIVERSAL" 类为它的子类提供几个通用的类方法。它提供以下几个方法:isa,can。其中isa用来判断变量是否从某个类继承而来,can后面的参数则是一个方法,判断这个方法是否在这个类或者基类中被定义。另外你可以给UNIVERSAL添加新的方法。一旦给它添加了新的方法,所有的class都可以调用。
给UNIBERSAL添加新方法的例子:
sub UNIVERSAL::log()
{
my($self,$msg)=@_;
print "$self: $msgn";
}
这样就可以在每个类中调用这个函数,并且log之前会把类名打印出来。
对象仅仅只是引用
Perl中的构造器只是一个子程序,该子程序返回一个被bless处理的引用,这个经过 bless 处理的引用就是人们所说的“对象”,而 bless 的作用就是用来说明这个对象是隶属于哪个“类”。
最简单的构造器:
package Critter;
sub new { bless {} }
如果你希望用户不仅能够用 "CLASS->new()" 这种形式来调用你的构造函数,还能够以 "$obj->new()" 这样的形式来调用的话,那么就这么做:
? ? ? ? sub new {
? ? ? ? ? ? my $this = shift;
? ? ? ? ? ? my $class = ref($this) || $this;
? ? ? ? ? ? my $self = {};
? ? ? ? ? ? bless $self,$class;
? ? ? ? ? ? $self->initialize();
? ? ? ? ? ? return $self;
? ? ? ? }
一个方法就是一个简单的子程序
方法把它被调用时的对象或者类名称当作它的第一个参数。有两种不同的调用方法的途径,分别成为“调用类方法”和“调用实例方法”。类方法把类名当作第一个参数。它提供针对类的功能,而不是针对某个具体的对象的功能。构造器通常是一个类方法。大多数类方法简单地忽略第一个参数,因为方法知道自己处在什么类里面,也不关心它是通过什么类来调用的。
Perl 提供了两种不同的形式去调用一个方法。最简单的形式是采用箭头符号:
? ? ? ? my $fred = Critter->find("Fred");
? ? ? ? $fred->display("Height","Weight");
你可以早就熟悉了引用的 "->" 操作符。事实上,因为上面的 $fred是一个指向了对象的引用,因此你也可以把箭头操作符理解为另外一种形式的解引用。
出现在箭头左边的引用或者类名,将作为第一个参数传递给箭头右边的方法。所以上面的代码就分别相当于这样:
? ? ? ? my $fred = Critter::find("Critter","Fred");
? ? ? ? Critter::display($fred,"Height",sans-serif; font-size:14px; line-height:21px"> 简单示例

复制代码

简单示例
1、说明
本程序演示了在Perl中如何进行面向对象编程:演示程序包含两个文件:person.pl?和?person.pm,把?person.pl?和?person.pm?放在当前目录下,运行 " perl?person.pl "即可以看到结果。person.pm定义了名为person的类。person.pl中创建了person类的实例,并测试了person的成员方法。

2、person.pm的内容
# !/usr/bin/perl?-w
package?person;
use?strict;

sub?new?{
my? $class?=? shift();
print( " CLASS?=?$classn ");
$self?=?{};?
$self->{ " name "}?=? shift();
$self->{ " sex "}?=? bless? $self,? $class;
return? $self;?
}

sub?getName?{
my?( $self)?=? @_;
$self->{ " name "};
}

sub?setName?{
$name)?=? @_;
$self->{ " name "}?=? $name;
}

sub?getSex?{
$self->{ " sex "};
}

sub?setSex?{
$sex)?=? $self->{ " sex "}?=? $sex;
}

3、person.pl的内容
use?strict;
use?person;

sub?main()
{
$tom?=?person->new( " Tom ",? " male ");
$kiss?=?person->new( " Kiss ",? " female ");
@persons?=?( $tom,128); line-height:1.5!important">$kiss);
for? $p?( @persons)?{
printf( " NAME:?%stSEX:?%sn ",128); line-height:1.5!important">$p->getName(),128); line-height:1.5!important">$p->getSex());
}
}

&main();

4、程序运行结果
CLASS?=?person
CLASS?=?person
NAME:?Tom?SEX:?male
NAME:?Kiss?SEX:?female

复制代码

来自:

http://bbs.chinaunix.net/thread-980909-1-1.html??

http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=770196 ?

?

完!?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读