免费注册 查看新帖 |

Chinaunix

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

关于perl 里类的实现的一些疑惑 [复制链接]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
1 [报告]
发表于 2006-12-07 17:57 |显示全部楼层
问题1的回答:
hash 里面没有存它的方法,这完全是 -> 操作符的功劳。-> 操作符其实也没有什么神秘之处,它只不过是调用了一下它右边的那个 sub(注),并且把左边的那个引用变量 unshift 到 sub 的参数列表中去。注:为了正确地找到右边的那个 sub,它还需要把左边的那个引用变量 ref 一下取出原先 bless 进去的那个 tag

问题2的回答:
你理解的是正确的。

问题3的回答:
new 的第一个参数是 $class,不是 $self,也就是说,new 的第一个参数是类名称,而不是对象,你估计是自己把自己绕糊涂了,根本就不存在你所说的“那个承载类的hash应该还没有创建吧”的问题——你该不会连“类”和“类的实例”这两个概念都搞不清楚吧?

问题4的回答:
bless 的作用是给第一个参数(必须是个引用)打上一个印记(就好像盖个戳一样),而这个印记就标明了这个引用从此以后应该属于哪个类。理解了这个之后,你就明白 bless $self, $class 和 $class = $self 其实是完全不同的东西。bless $self, $class 之后,$class 还是原来的值,$self 也还是原来的值,只不过 $self 的印记变成了 $class 的内容。$class = $self 则是把 $class 变成和 $self 值相同的一个变量。

题外话:
1,new 的名称不是 Perl 语法的一部分,你完全可以叫 create, construct, build, 或者别的东西。
2,对象也不一定要用 hash 引用来存储数据,事实上任何类型的引用都可以,只不过 hash 引用正好方便表示 OOP 里面的“属性=>值”这种模型而已。事实上,CPAN 上就有一组用数组引用来构造类体系的,更加省空间。
3,Perl 对 OOP 提供的语法很有限,但是支持 OOP 的大多数概念。这些有限的语法包括 bless 函数、package 语句、-> 操作符、还有 @ISA 数组,以及 SUPER UNIVERSAL 等有限的几个关键字。除此以外我想再没有别的东西了。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
2 [报告]
发表于 2006-12-08 17:46 |显示全部楼层
> 这个$self 这么样, 就是类的本身了 "->" 的功能原理真是神奇!
你这里有点小错误,$self 在你举的这个例子中,是 $object,也就是对象/类实例而不是类。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
3 [报告]
发表于 2007-03-08 16:09 |显示全部楼层
原帖由 knuoxy 于 2007-3-8 14:52 发表
通过你们的讨论我自己结合做了点总结,但有些地方用语言根本无法形容,哪位高手最好给例子?

类和方法理解
类其实就是一包,而包只不过是perl符号表中名字的集合,方法只不过是perl的一个子程序,
类名是第一 ...

拜托你把你想说的话和引用我的话分开好不好?
不然的话看上去都不知道在说什么。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
4 [报告]
发表于 2007-03-08 17:31 |显示全部楼层
看不懂你的程序。
My Sub 的。
而且不知道哪些是程序哪些是描述。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
5 [报告]
发表于 2007-03-08 17:33 |显示全部楼层
> 将得$cup 因此$class知道自己也属于Cocoa类
不知道“将得”是啥意思。

> 那么是不是说declareMain就成为了实例方法,也就是虚方法
你到底是想说 declareMain 是实例方法还是想说它是虚方法?

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
6 [报告]
发表于 2007-03-08 17:34 |显示全部楼层
> #因为$cup对象知道自己属于Cocoa类因此它调用的方式就如Cocoa::declareMain($cup(“Msg”,”java.appet.Applet”,”Runnable”);
对象什么都不知道。它又没有智商你怎么让它知道?

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
7 [报告]
发表于 2007-03-08 17:36 |显示全部楼层
> 而sub new则是静方法 也就是类方法
这里又冒出一个“静方法”,你说的是指“静态(static)”的意思吗?怎么这么多我听都没听过的术语?

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
8 [报告]
发表于 2007-03-08 17:37 |显示全部楼层
原帖由 perlpg 于 2007-3-8 17:33 发表

其实有代表性的代码比文字更好解释。 ...

说的不错。以前讨论时我写过几段这样的代码,事实上文档里也有不少这样的代码。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
9 [报告]
发表于 2007-03-08 17:41 |显示全部楼层
原帖由 knuoxy 于 2007-3-8 16:45 发表

真不好意思。。我是直接ctrl+v的上去的。。

复制就复制吧。你最起码可以在两边加个 【】 括号嘛。再要不这样子
----------------------------------
引用部分
----------------------------------
这样都很不错啊。

原帖由 knuoxy 于 2007-3-8 16:45 发表

下次会注意

下次复下次,下次何其多。
为什么不从这次就开始呢?
BBS 有编辑功能的。

总之一句话,如果你想要别人帮你,那就尽量方便一下看帖子的人。
不然人家都看不懂你在说什么,怎么帮你?

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
10 [报告]
发表于 2007-03-08 19:33 |显示全部楼层
原帖由 knuoxy 于 2007-3-8 18:30 发表
我发觉flw说话很刻薄,可能你是无心之过。
论坛本来就是方便大家交流的。
我是凭借自己的感觉去发问的,难免有部分是表达不清,我想每个人都是这么走过来的(当然排除你在外)
但我给于你一些建议,你可以不必回答你觉的没有任何意义的帖子。

> 可能你是无心之过。
我不是无心之过,我是故意的。

> 论坛本来就是方便大家交流的。
你觉得你给别人带来了“方便”了吗?让你编辑一下你的帖子你还不改,这是“方便交流”的态度吗?

> 我是凭借自己的感觉去发问的,难免有部分是表达不清。
这里不是你的博客,也不是你的日记本。“凭感觉去发问”,而不遵守最起码的规则,就应该受到批评。
你自己说话纠缠不清,我给你指出来,你不思考我的回帖倒也罢了,居然还好意思说“难免……”,你这治学态度就非常有问题。

> 你可以不必回答你觉的没有任何意义的帖子。
这里我是版主,我有权要求你。维持这里的秩序是我的义务,看到不符合版规,我就要规劝一下,对于部分拒不执行的,我可以采取强制措施。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP