perl 继承 @ISA

摘要:
如果没有,Perl先询问@Horse::ISA的第一个元素,而不是生成一个运行时错误,这样将导致查询到Critter包里,并找到Critter::move。
12.5 类继承

对Perl的对象剩下的内容而言,从一个类继承另外一个类并不需要给这门语法增加特殊的语法,当你调用一个方法的时候,

如果Perl在调用者的包里找不到这个字过程,那么他就检查@ISA数组

perl是这样实现继承的,一个包@ISA数组了的每个元素都保持另外一个包的名字


当缺失方法的时候就搜索这些包。

比如,下面的代码把Horse类变成了Critter类的子类 (这里Critter是父类,或称为基类)


我们用our 声明@ISA,因为它必须是一个打包的变量,而不是用my声明

package Horse;
our @ISA = "Critter";


你现在可以在原来Critter使用的任何地方使用Horse类或者对象了

Critter 是一个正确的基类,可以用于 继承。


Horse 类:
[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 sum_arr {
       $self=shift;
       my $a=shift;
       my $b=shift;
       return $a + $b + 7;
};
1;



基类 Critter类:

[root@wx03 test]# 
[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 sum {
       $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->sum_arr(4,5);
print "
";
print $ed->sum(4,5);

[root@wx03 test]# perl t6.pl 
16
9[root@wx03 test]# 



假设你在 $steed 里有一个 Horse 对象,并且在他上面调用了一个 move:
$steed->move(10);
因为 $steed 是一个 Horse,Perl 对该方法的第一个选择是 Horse::move 子过程。如果 没有,Perl 先询问

@Horse::ISA 的第一个元素,而不是生成一个运行时错误,这样将导致 查询到 Critter 包里,并找到

Critter::move。如果也没有找到这个子过程,而且 Critter 有自己的 @Critter::ISA 数组,那么继续查询那里面

的父类,看看有没有一个 move 方法,如此类推直到上升到继承级别里面一个没有 @ISA 的包

免责声明:文章转载自《perl 继承 @ISA》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇web快速开发框架 WebBuilder 8.7发布灰度图与彩图的双边滤波下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

R语言学习——R读取txt、csv、xls和xlsx格式文件

最近项目中运用到了R读取文件数据,所以把相关好用的、经过验证的方法总结了一下,有效避免下次入坑。 1. R读取txt文件 使用R读取txt文件直接使用read.table()方法进行读取即可,不需要加载额外的包。 read.table("/home/slave/test.txt",header=T,na.strings = c("NA")) 1 注意,此处...

perl 中的my和全局变量

$Some::stuff 使用包some的标准变量$stuff our 把名字限制于一个作用域, local 把值限制于一个作用域, my 把名字和值都限制于一个作用域 my变量: [root@master Webqq]# cat t5.pl {my $var=11;print "$var is 1--$var ";}{print "$va...

在ubuntu上面安装perl

随着人们对编程效率追求热情的提高,脚本语言便开始深受人们的喜爱,其中就包括perl。在这里我们不深究perl的历史,也不争论perl和python孰优孰劣,我们看看怎么在ubuntu上面安装perl,我用的版本是ubuntu11.10。 在www.perl.com和www.cpan.org 上面有很多关于perl的资料和ActiveStatePerlDev...

MRTG—网络监控工具

  最近一段时间在研究后台服务器测试技术,需要对后台服务器的各项性能指标进行实时监控和统计,也由此让我回想起之前公司曾经接触过的一个服务SNMP,SNMP是一种称之为简单网络管理协议的服务,主要是用于获取系统的流量、I/O、CPU、Memory和Disk等信息,通过自带的统计功能,将信息发送于监控程序上,最后以统计报表的形式展现于管理员,这种方式正是我所要...

哪种脚本语言最适合你!

本文译自 iSystemAdmin 的 《List Of Popular Scripting Languages for Linux and Windows》。 具备脚本知识的系统管理员与其他系统管理员有着明显的区别。脚本是一门“系统管理员”创造的艺术。这门艺术需要了解系统本身的相关知识,系统管理命令的语法,编程和算法知识以及至少一门脚本编程语言。对系统管...

使用模块

11.1 使用模块 模块有两种风格:传统的和面向对象的。传统模块为调用者的输入和使用定义了子过程和 变量。面向对象的模块的 运转类似类声明并且是通过方法调用来访问的,在第十二章, 对象,里描述。有些模块有上面两种类型的东西。 因此 如果你的模块的名字是 Red::Blue::Green,Perl 就会把它看作Red/Blue/Green.pm。...