有时候,你希望一个衍生类的方法表现得象基类中的某些方法的封装器 这就是 SUPER 伪类提供便利的地方。它令你能够调用一个覆盖了的基类方法,而不用声明 是哪个类定义了该方 法。(注:不要把这个和第十一章的覆盖 Perl 的内建函数的机制混淆 了,那个不是对象方法并且不会被继承覆 盖。你调用内建函数的覆盖是通过 CORE 伪包,而 不是 SUPER 伪包。)下面的子过程在当前包的 @ISA 里查 找,而不会要求你声明特定类: [root@wx03 test]# cat Horse.pm 当前类: package Horse; our @ISA = "Critter"; sub new { my $invocant = shift; my $class = ref($invocant) || $invocant; my $self = { color => "bay", legs => 4, owner => undef, @_, # 覆盖以前的属性 }; return bless $self, $class; }; sub sum1 { $self=shift; my $a=shift; my $b=shift; return $a + $b + 7; }; 1; [root@wx03 test]# cat Critter.pm 基类: package Critter; sub new { my $self = {}; my $invocant = shift; my $class = ref($invocant) || $invocant; my ($name)=@_; my $self = { "name" =>$name }; bless $self, $class; # Use class name to bless() reference return $self; }; sub sum1 { $self=shift; my $a=shift; my $b=shift; return $a + $b; }; sub fun1 { $self=shift; my $a=shift; my $b=shift; return $a / $b; } 1; [root@wx03 test]# cat t6.pl unshift(@INC,"/root/test"); use Horse;; use base qw(Critter); require Critter; use Data::Dumper; $ed = Horse->new; # 四腿湾马 print $ed->sum1(4,5); print " "; print $ed->sum1(4,5); print " "; [root@wx03 test]# perl t6.pl 16 16 此时由于当前包的方法覆盖了基类的方法 所以都是16 [root@wx03 test]# cat t6.pl unshift(@INC,"/root/test"); use Horse;; use base qw(Critter); require Critter; use Data::Dumper; $ed = Horse->new; # 四腿湾马 print $ed->sum1(4,5); print " "; print $ed->SUPER::sum1(4,5); print " "; [root@wx03 test]# perl t6.pl 16 9 这时候会访问覆盖的方法