曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 6367|回复: 0
打印 上一主题 下一主题

[OOP] 类,包,对象,bless 函数

[复制链接]

4917

主题

5879

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34382
跳转到指定楼层
楼主
发表于 2011-10-29 11:11:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
Perl 中,类(class) 就是一种包 (package),这两个术语可以互换。

类一般位于 .pm 模块中,类名和模块名也相同,比如一个模块名为 mywife.pm ,那么类的名字就是 mywife 。类一般由下面几个部分组成:

1. 描述对象的数据
2. 一个名为 "bless" 的函数,它用来创建对象。
3. 称为“方法”的特殊子例程,我们就是用这些方法来创建,访问,操作,以及销毁对象。

由于 Perl 不会严格监控模块中的 公有/私有 的界限。如果要保证变量的私有性,那么必须使用 my 函数。用户是不能通过双冒号或单撇号从其他包中访问 my 变量,因为 my 变量不和任何包相关,也不存储在创建它的包的符号表里,比如:
[code=perl]#!/usr/bin/perl
#声明 main 包
package main;


$name = "beyes";


my $domain = "groad";
#切换到 outmain 包中
package outmain;


print "My name is $name\n";


print "Can we access the $main::domain ?\n";[/mw_shl_code]
运行输出:
[beyes@beyes class]$ ./temp.pl
My name is
Can we access the  ?
由输出可见,$name 的变量具有全局作用域,所以它在 main 和 outmain 中都可见,但是在 outmain 包里无法使用双冒号来获取 my 声明的变量 $domain。这是因为,outmain 包的作用域是从声明之处开始到文件末位,而 $domain 只是一个 main 中的局部变量,它和符号表毫无关系,而只是存储在封闭代码块中所创建的专用缓冲区里。

对象
在 Perl 中,对象其实就是一块数据,而这块数据会用一个匿名散列来表示。之所以是匿名散列,这是因为它没有必要人为其定义一个名字。在这个散列中,包含了对象的数据成员和属性。

创建一个对象,首先应创建引用,这个引用的值一般就是上面所说的匿名散列的地址。接着,该引用还应当知道它所属的包。也就是说,包中有操作对象的方法,当知道了它所属的包后,它才能使用里头的这些方法。让引用 “归入” 到某个包使用 bless 函数来达到此目的。bless 能把引用的“东西”(而不是引用本身)加入到包中,这里的“东西”就是值匿名散列对象所指的数据。  bless 函数有两种使用形式:
1. bless ($ref, Class);
2. bless ($ref);
但不管哪种形式,bless 函数的第 1 个参数必须是一个指针,第  2 个参数则是可选项;当指定第 2 个参数时,就归入参数所指定的包中,如果省略,那么就使用当前的包。该函数返回被归入的对象的引用,比如如下使用:
[code=perl]
# $ref 是匿名散列的引用
        my $ref = {
                        "Onner" => undef,
                        "Price" => undef,
        };
#将对象归入到一个名叫 Class 的包中
        bless($ref, class);

#返回对象的引用
        return $ref;
[/mw_shl_code]

下面程序中简单的示例了包(类)以及对象的声明,以及 bless 函数的使用:
[code=perl]#!/usr/bin/perl
#声明包
package House;

# $ref 是匿名散列的一个引用
        my $ref = {
                        "Onner" => undef,
                        "Price" => undef,
        };
#bless 将引用 $ref 引用所指向的对象归入 House 包中
        bless($ref, House);

        print "The value of \$ref is: $ref.\n";

        print "The ref function returns the class (package) name: ", ref($ref), ".\n";
[/mw_shl_code]

运行输出:
$ perl House.pl
The value of $ref is: House=HASH(0x9b88830).
The ref function returns the class (package) name: House.

程序中,ref 函数的参数是一个对象的引用时,函数返回这个对象所归属到的包的名称,这里就是第 2 个参数所指定的 House 。因为这里只声明了一个 House 包,如果上面的 bless 函数不指定第 2 个参数,那么就默认使用当前的包,即 House。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2024-5-6 03:15 , Processed in 0.068099 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表