Perl的面向对象方法

{ 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/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/24104518/viewspace-722694/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值