第十二章 对象(下)

第十二章 对象(下)

12.5.1 通过 @ISA 继承

package Mule;
our @ISA= ("Horse", "Donkey");

Perl 将首先在Horse 里(和他的任何前辈类里,比如Critter)查找任何在Mule里找不到的方法,


找不到以后才继续在Donkey 和其父类里进行查找。


如果缺失的方法在一个基类里发现,Perl内部把该位置缓存到当前类里,依次提高效率,


当 Perl 搜索一个方法的时候,它确信你没有创建一个闭环的继承级别。如果两个类互相 继承则可能出现这个问
题

Vsftp:/root/perl/9# perl a1.pl 
Recursive inheritance detected in package 'Horse' at Critter.pm line 2.
Compilation failed in require at a1.pl line 3.
BEGIN failed--compilation aborted at a1.pl line 3.

使用use base 声明父类:

Vsftp:/root/perl/9# cat Horse.pm 
package Horse;
use base ("Critter");
sub new {
my $invocant = shift;
my $class = ref($invocant) || $invocant;
my $self = {
color => "bay",
legs => 4,
owner => undef,
@_, # 覆盖以前的属性
};
return bless $self, $class;
};
sub sum_arr {
       $self=shift;
       my $a=shift;
       my $b=shift;
       return $a + $b + 7;
};
1;
Vsftp:/root/perl/9# 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 sum {
       $self=shift;
       my $a=shift;
       my $b=shift;
       return $a + $b;
};
1;
Vsftp:/root/perl/9# cat a1.pl 
unshift(@INC,"/root/perl/9"); 
use Horse;;
use Critter;
use Data::Dumper;
$ed = Horse->new; # 四腿湾马
print $ed->sum_arr(4,5);
print "\n";
print $ed->sum(4,5);
print "\n";
Vsftp:/root/perl/9# perl a1.pl 
16
9




12.5.2  访问被覆盖的方法:

基类就是父类:

Vsftp:/root/perl/9# cat Horse.pm 
package Horse;
use base ("Critter");
sub new {
my $invocant = shift;
my $class = ref($invocant) || $invocant;
my $self = {
color => "bay",
legs => 4,
owner => undef,
@_, # 覆盖以前的属性
};
return bless $self, $class;
};
sub sum {
       $self=shift;
       my $a=shift;
       my $b=shift;
       return $a + $b + 7;
};
1;
Vsftp:/root/perl/9# 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 sum {
       $self=shift;
       my $a=shift;
       my $b=shift;
       return $a + $b;
};
1;
Vsftp:/root/perl/9# cat a1.pl 
unshift(@INC,"/root/perl/9"); 
use Horse;;
use Critter;
use Data::Dumper;
$ed = Horse->new; # 四腿湾马
#print $ed->sum_arr(4,5);
print "\n";
print $ed->sum(4,5);
print "\n";
Vsftp:/root/perl/9# perl a1.pl 

16

此时Horse 类覆盖了基类Critter的 sum方法


Vsftp:/root/perl/9# cat a1.pl 
unshift(@INC,"/root/perl/9"); 
use Horse;;
use Critter;
use Data::Dumper;
$ed = Horse->new; # 四腿湾马
print $ed->Critter::sum(4,5);
print "\n";
print $ed->sum(4,5);
print "\n";
Vsftp:/root/perl/9# perl a1.pl 
9
16


调用父类Critter::sum sum的方法

Vsftp:/root/perl/9# cat a1.pl 
unshift(@INC,"/root/perl/9"); 
use Horse;;
use Critter;
use base qw(Critter);
use Data::Dumper;
$ed = Horse->new; # 四腿湾马
print $ed->SUPER::sum(4,5);
print "\n";
print $ed->sum(4,5);
print "\n";
Vsftp:/root/perl/9# perl a1.pl 
9
16



12.5.3  UNIVERSAL:最终的祖先类


12.5.4 方法自动装载


12.5.5 私有方法

posted @ 2016-11-25 15:23  czcb  阅读(127)  评论(0编辑  收藏  举报