免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2733 | 回复: 2
打印 上一主题 下一主题

面向对象的问题: 类内的方法如何调用类内另一个方法? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-03-13 05:26 |只看该作者 |倒序浏览
下面是定义的一个类. 类中的testfunc2()要调用testfunc(), 发现还是要写 testfunc($this,a,b)..
我看有文档上说可以这么写 &testfunc(a,b), 不过这样只有b参数被传递了,a被当class类shift掉了.

还有网上的文档里说要将类的方法export出去后才能供其它包使用. 比如 require Exporter; @ISA = qw (Exporter); @EXPORT = qw ( readfile checkfile);
为什么我没有export, 而其它包比如pkg2.pm, 在里面直接 use state; 再 $state=state->new(); $state->testfunc(); 照样可以调用到.

还有说类内的变量必须通过函数才能访问,但是我在pkg2.pm中照样可以通过 $state->{name} 直接访问state对象的变量.

是不是perl面向对象很慢? 我用perl改写之前写的delphi程序,速度变慢得非常多..

谢谢
  1. package state;

  2. sub new {
  3.   my $type=shift;
  4.   my %param=@_;
  5.   my $this={};
  6.   $this->{name}=$param{'name'};
  7.   $this->{x}=$param{'x'};
  8.   bless $this,$type;
  9.   return $this;
  10. }

  11. sub DESTROY {
  12.   
  13. }

  14. sub testFunc {
  15.   my $this=shift @_;
  16.   my @names = @_;
  17.   print "params=@names\n";
  18. }

  19. sub testFunc2 {
  20.   my $this=shift @_;
  21.   testFunc($this,'a','b');
  22. }


复制代码

论坛徽章:
0
2 [报告]
发表于 2010-03-13 10:46 |只看该作者
下面是定义的一个类. 类中的testfunc2()要调用testfunc(), 发现还是要写 testfunc($this,a,b)..
我看有文档上说可以这么写 &testfunc(a,b), 不过这样只有b参数被传递了,a被当class类shift掉了.


在class里一个函数调用另一个函数,没有固定的写法。
可以直接调用,例如:

sub _a {
    my $arg = shift;
    ...
}

_a('arg');

也可以通过$self来调用,例如:

sub _a {
    my $self = shift;
    my $arg = shift;
    ...
}

$self->_a('arg');

取决于你如何调用,函数定义稍有不同。
我两种写法都用过,如果_a()里需要访问$self属性的话,就用第二种。否则用第一种。


还有网上的文档里说要将类的方法export出去后才能供其它包使用. 比如 require Exporter; @ISA = qw (Exporter); @EXPORT = qw ( readfile checkfile);
为什么我没有export, 而其它包比如pkg2.pm, 在里面直接 use state; 再 $state=state->new(); $state->testfunc(); 照样可以调用到.


perl没有私有函数的概念。函数一旦定义,就写入该package的符号表,所以永远可以通过$class->func()或者Class::func()的方式来访问这个函数,不管你是否认为它是私有的。
Exporter这个模块,只是做了一些符号表别名的操作,例如把package的符号表的部分,别名到main的符号空间。
在package里没有export的函数,在caller里不能直接使用。需要通过目标或全包名才能调用。


还有说类内的变量必须通过函数才能访问,但是我在pkg2.pm中照样可以通过 $state->{name} 直接访问state对象的变量.



你访问的是bless的目标里的一个属性,该属性通常来说是作者有意隐藏的,但不代表你不可以访问它。

sub new {
    my $class = shift;
    bless { name => 'john', sex => 'male', age => 20 }, $class;
}

一旦new,everywhere都能访问到这个目标里的name, sex, age属性。


是不是perl面向对象很慢? 我用perl改写之前写的delphi程序,速度变慢得非常多..


perl面向对象其实是用一系列技巧来模拟的,只是写起来你觉得很OO,但本质上不是OO(看看ruby的OO设计体系)。
由于进行了一些封装,所以perl OO会比纯函数稍慢一点。

但至于你说的速度变慢很多,不一定与OO有关,而可能是:
1)delphi是编译性语言,而perl不是;
2)程序写的不是很高效,等等。

论坛徽章:
0
3 [报告]
发表于 2010-03-14 04:54 |只看该作者
回复 2# 兰花仙子


   很详细的解释,非常感谢.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP