免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: yiten
打印 上一主题 下一主题

大家讨论下Perl OO的实现方式以及特点 [复制链接]

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
31 [报告]
发表于 2011-01-22 18:01 |只看该作者
You can bless any reference. Nobody can touch the attributes without 'get'/'set' methods in foll ...
greencow 发表于 2011-01-21 23:01



    这个狠 {:2_170:}

论坛徽章:
0
32 [报告]
发表于 2011-01-23 14:11 |只看该作者
本帖最后由 兰花仙子 于 2011-01-23 17:36 编辑

回复 1# yiten

spam

论坛徽章:
0
33 [报告]
发表于 2011-01-24 11:02 |只看该作者
You can bless any reference. Nobody can touch the attributes without 'get'/'set' methods in foll ...
greencow 发表于 2011-01-21 23:01



晕,你怎样OO出来会是个什么东西?
$h是个全局变量,各个对象之间会共享

论坛徽章:
0
34 [报告]
发表于 2011-01-24 11:48 |只看该作者
$h是个全局变量,各个对象之间会共享
yiten 发表于 2011-01-24 11:02



    怎么个全局共享法?能否演示一下?

论坛徽章:
0
35 [报告]
发表于 2011-01-24 12:19 |只看该作者
怎么个全局共享法?能否演示一下?
兰花仙子 发表于 2011-01-24 11:48



$o1 = MyOO->oo();
$o2 = MyOO->oo();
$o1和$o2的$h指向同一个哈希,$o1往$h里头放的东西,$o2也能取出来

论坛徽章:
0
36 [报告]
发表于 2011-01-24 12:44 |只看该作者
$o1 = MyOO->oo();
$o2 = MyOO->oo();
$o1和$o2的$h指向同一个哈希,$o1往$h里头放的东西,$o2也能 ...
yiten 发表于 2011-01-24 12:19



    那麻烦再演示下怎么放,怎么取。。

论坛徽章:
0
37 [报告]
发表于 2011-01-24 13:27 |只看该作者
看错了,不是同一个哈希,他这样写每oo一个对象,$h都要指向另外一个哈希。这同样是有问题的。

package MyOO;
use Data:umper;
my $h = {};
sub oo {
    my $class = shift;
    $h = {@_};
    my $obj='donot touch my values';
    bless \$obj, $class;
    return \$obj;
}
sub do_print {
    my $this = shift;

    print Dumper($h);
}

test.pl如下:
use strict;
use warnings;

use Data:umper;

use MyOO;

my $o1 = MyOO->oo( 'a' => 1);
my $o2 = MyOO->oo( 'a' => 2);
$o1->do_print();
$o2->do_print();
输出如下:
$VAR1 = {
          'a' => 2
        };
$VAR1 = {
          'a' => 2
        };

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
38 [报告]
发表于 2011-01-24 13:34 |只看该作者
其实是把 $h 当作个集合就可以创建多个对象,保存每个对象就可以了,不过要用 weaken 加上 Readonly 效果更佳 {:2_169:}

论坛徽章:
0
39 [报告]
发表于 2011-01-24 13:59 |只看该作者
对,一种方法是,用全局变量来保存各个实例引用。
为了各个实例之间的隔离,可以使用实例唯一标示符作为键。
Class::Std就是这样的原理,如ident,refaddr。但这也达不到完全的封装。

论坛徽章:
0
40 [报告]
发表于 2011-01-24 16:42 |只看该作者
回复 39# yiten


确实有问题。这样会好些吧。
  1. package MyOO;
  2. use Data::Dumper;
  3. my $h = [];
  4. sub oo {
  5.     my $class = shift;
  6.     push @$h, {@_};
  7.     bless \scalar(@$h), $class;
  8. }
  9. sub do_print {
  10.     my $idx = ${$_[0]} - 1;
  11.     print Dumper $h->[$idx];
  12. }

  13. 1;

  14. package test;
  15. use strict;
  16. use warnings;

  17. my $o1 = MyOO->oo( 'a' => 1);
  18. my $o2 = MyOO->oo( 'a' => 2);
  19. $o1->do_print;
  20. $o2->do_print;
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP