ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Perl的面向对象方法

Perl的面向对象方法

原创 Linux操作系统 作者:物理狂人 时间:2012-05-04 10:17:52 0 删除 编辑
{ package LivingCreature;
sub speak{
my $class = shift;
my $gender = shift;
print "a $gender $class goes ", $class->sound, "!\n";
}
}

{ package Animal;
@ISA = qw(LivingCreature);
# no definition for speak()
}

{ package Mouse;
@ISA = qw(Animal);
sub sound{'squeak'}
sub speak{
my $class = shift;
$class->SUPER::speak(@_);
print "[but you can barely hear it!]\n";
}
}

Mouse->speak('female');

E:\Documents and Settings\Administrator\My Documents\PerlScript>perl perl.pl
a female Mouse goes squeak!
[but you can barely hear it!]

注解:Class->method(@args)或者my $beast= 'Class'; $beast->method(@args)将会构建('Class', @args)参数列表,然后调用Class::method('Class',@args);如果没有发现Class::method,则到@Class::ISA的包中寻找相应method。
$class->SUPER::speak(@_),从当前包的@ISA中对应的包中寻找speak方法,并将($class,@_)传递过去

如果将$class->Animal::speak(@_)换成Animal::speak($class, @_)后,因为在Animal中不存在speak方法,所以程序将出错。而现在的方法在发现Animal中不存在speak方法后将去查询他的@ISA中包的方法,发现LivingCreature存在speak方法,并调用

--------------------------------------------------------------------------------------
开发完一个类之后需要Export,接下来介绍一下相关内容
当输入use Island::Plotting::Maps qw(load_map scale_map draw_map);

其等价于:
BEGIN{
require Island::Plotting::Maps;
Island::Plotting::Maps->import(qw(load_map scale_map draw_map));
}

这里的require等价于 require "Island/Plotting/Maps.pm"

接下来利用Exporter的import以Navigate::SeatOfPants为了说明:
package Naviagte::SetOfPants;
use base qw(Exporter);  #包含import方法

our @EXPORT = qw(guess_direction_toward);
our @EXPORT_OK =qw(
get_north_from_professor
according_to_GPS
ask_the_skipper_about
);

our %EXPORT_TAGS = (
all =>  [@EXPORT, @EXPORT_OK],
gps  =>  [qw(according_to_GPS)],
direction  =>  [qw(
get_north_from_professor
according_to_GPS
ask_the_skipper_about
guess_direction_toward
)],
);

@EXPORT表示Navigate::SeatOfPants默认被import的方法,
@EXPORT_OK表示Navigate::SeatOfPants可以被import的方法
%EXPORT_TAG的key表示一组Navigate::SeatOfPants可以被import的方法
use Navigate::SeatOfPants qw(:direction);

当然也可以直接写import方法,以File::Basename为例:
sub import {
no strict 'refs';
my ($package, $file, $line) = caller;
warn "I was called by $package in $file\n";
for (qw(filename basename fileparse)){
*{$package."::$_"}= \&$_;
}
}
将生成衣调用者为前缀的函数

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/24104518/viewspace-722694/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2010-06-16

  • 博文量
    80
  • 访问量
    140210