请教use module和@ISA的区别
时间:2011-02-17
来源:互联网
刚刚看完对象这一章,我有点迷糊
我自己写了个试验一下
----------------------------------------
A.pm代码如下:
package A;
use Exporter;
@Export=qw(foo);
sub foo{
print "this is a method in A.pm
};
-----------------------------------------
B.pm代码如下:
package B;
use Exporter;
use A;
@Export=qw(barney);
sub barney{
print "this is a method in B.pm
};
-----------------------------------------
test.pl
use B;
foo;
barney;
-----------------------------------------
能够正常输出:
this is a method in A.pm
this is a method in B.pm
1.这个和继承有什么区别吗?外面模块的符号引入和继承这两个知识点各有什么不同
2.use module的形式,是不是很容易造成“符号”的重名?
use A,而A.pm中又use B,而B.pm中又use C,最后用户的脚本use A,这样就把A,B,C所有默认的符号都引入了
3.书上一直说如果在当前包中找不到方法,就到@ISA中列举的包中去寻找,请问
---------------------------------------
package D;
use Exporter;
@Export=qw(foo);
sub foo{
print "this is a method in D.pm
};
----------------------------------------
package C;
@ISA=qw(A);
use D;
sub new{...} #Construtor;
.......
---------------------------------------
#!/usr/bin/perl
$obj=C->new;
$obj->foo;
---------------------------------------
D.pm和A.pm中都定义了方法foo,那继承和use module这两个在这里会用哪个?
作者: seufy88 发布时间: 2011-02-17
- #!/usr/bin/perl
-
- package A;
-
- sub new {
- my $class = shift;
- $class = ref($class) || $class;
- my $self = {};
- return bless $self , $class;
- };
-
- sub myprint {
- print "i am in A\n";
- };
-
- package B;
- @ISA=qw/A C/;
-
- sub myprint {
- print "i am in B\n";
- };
-
- package C;
-
- sub new {
- my $class = shift;
- $class = ref($class) || $class;
- my $self = {};
- return bless $self , $class;
- };
-
- sub myprint {
- print "i am in C\n";
- };
-
- package main;
- use B;
- my $obj = new B;
- $obj->myprint();
i am in B
删除B中的方法,那么输出为:
i am in A
对换·@ISA列表中的 A C为C A
输出为
i am in C
作者: justlooks 发布时间: 2011-02-17
导入函数后来的会覆盖之前的,继承也只有在方法调用的时候出现很容易区分
作者: zhlong8 发布时间: 2011-02-17
先谢谢
作者: seufy88 发布时间: 2011-02-17
导入函数后来的会覆盖之前的,继承也只有在方法调 ...
zhlong8 发表于 2011-02-17 10:22
谢谢 ,其实我想明白导入函数和继承方法同名时,会是个什么样情况

"导入函数是在这个包里搞个别名"那这个包如果返回一个对象$obj,那可不可以像调用实例方法一样去调用导入函数?
"$obj->导入函数"这样的形式?
按你的意思,是不是继承的方法能用$obj->的形式,而导入函数不能用$obj->去调用?
我第二个例子就是这样的情况
作者: seufy88 发布时间: 2011-02-17
按你的意思,继承的方法只 ...
seufy88 发表于 2011-02-17 10:27
导入函数能用$obj->去调用,导入的函数和你自己在包里定义的函数是同等地位的。如果你导入了那就等于这个类就有这个方法了,当然就不会继承了
作者: zhlong8 发布时间: 2011-02-17
zhlong8 发表于 2011-02-17 10:32
非常非常感谢你的回答.这么一说我就明白啦.祝大家元宵快乐

作者: seufy88 发布时间: 2011-02-17
那肯定是A里面的东西啊,在编译时已经导入这个包的函数了,所以你调用的时候不会发生继承
作者: justlooks 发布时间: 2011-02-17
那肯定是A里面的东西啊,在编译时已经导入这个包的函数了,所以你调用的时候不会发 ...
justlooks 发表于 2011-02-17 10:34
恩恩,偶明白啦.
还有一个问题,既然导入函数和继承都是从"外部模块"实现的,当前包都没有这个定义,那什么情况下用导入函数,什么情况下用继承好呢?总感觉大家这么一解释,他们俩可以"互换",比如将原先i当前包继承的那个类取消继承,改为use ,好像也能达到同样的效果哈?反之也一样
作者: seufy88 发布时间: 2011-02-17
还有一个问题,既然导入函数和继承都是从"外部模块"实现的,当前包都没有这个定义 ...
seufy88 发表于 2011-02-17 10:39
导入会污染当然包的符号表,如果你是按 OO 风格设计的相关方法当然用继承,最终都是函数的调用
作者: zhlong8 发布时间: 2011-02-17
zhlong8 发表于 2011-02-17 10:44
"污染"这词太达意了

PS:原来符号的导入可以"迭代"的
作者: seufy88 发布时间: 2011-02-17
那肯定是A里面的东西啊,在编译时已经导入这个包的函数了,所以你调用的时候不会发 ...
justlooks 发表于 2011-02-17 10:34
试了一个,果然是A,但按理是D才是阿?不是已经use D了么,那应该不会继承才是的呀

------------------------------------------
D.pm
package D;
use Exporter;
@Export=qw(foo);
sub foo{
print "this is a method in D.pm
};
------------------------------------------
package A;
use Exporter;
@Export=qw(foo);
sub foo{
print "this is a method in A.pm
};
package C;
@ISA=qw(A);
use D;
sub new{...} #Construtor;
package main
#!/usr/bin/perl
$obj=C->new;
$obj->foo;
作者: seufy88 发布时间: 2011-02-17
其实就是用typeglob做的一个别名,并不是变量copy。
作者: 兰花仙子 发布时间: 2011-02-17
兰花仙子 发表于 2011-02-17 11:20
偶一开始看typeglob不适应,为什么要是*来glob,再用funny character来区别类型,其他语言中好像没这么glob的呀.
后来看到可以直接对特定类型变量进行alias才适应.
请问仙子typeglob现在用的多吗?好像在书中很少看到别名了,除了在符号表里,大多是引用来着
作者: seufy88 发布时间: 2011-02-17
seufy88 发表于 2011-02-17 11:24
用的很少。一些高级类库在背后是使用了typeglob的,你只需要用那些库就可以了。
作者: 兰花仙子 发布时间: 2011-02-17
学了这个,写 perl oo 程序非常简单。
作者: horsley 发布时间: 2011-02-17
作者: zhlong8 发布时间: 2011-02-17
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28