我理解bless了,哈哈,给大家个例子。

我理解bless了,哈哈,给大家个例子。


程序说明

网上的很多教程都没有把bless讲清楚,我通过摸索和实验,终于明白bless是什么意思了,简单的讲:

  • bless有两个参数:对象的引用、类的名称。
  • 类的名称是一个字符串,代表了类的类型信息,这是理解bless的关键。
  • 所谓bless就是把 类型信息 赋予 实例变量。


程序包括5个文件:
person.pm :实现了person类
dog.pm :实现了dog类
bless.pl : 正确的使用bless
bless.wrong.pl : 错误的使用bless
bless.cc : 使用C++语言实现了与bless.pl相同功能的代码


person.pm


[Copy to clipboard] [ - ]
CODE:
#!/usr/bin/perl -w
package person;
use strict;

sub sleep() {
        my ($self) = @_;
        my $name = $self->{"name"};

        print("$name is person, he is sleeping\n");
}

sub study() {
        my ($self) = @_;
        my $name = $self->{"name"};

        print("$name is person, he is studying\n");
}
return 1;


dog.pm


[Copy to clipboard] [ - ]
CODE:
#!/usr/bin/perl -w
package dog;
use strict;

sub sleep() {
        my ($self) = @_;
        my $name = $self->{"name"};

        print("$name is dog, he is sleeping\n");
}

sub bark() {
        my ($self) = @_;
        my $name = $self->{"name"};

        print("$name is dog, he is barking\n");
}

return 1;


bless.pl


[Copy to clipboard] [ - ]
CODE:
#!/usr/bin/perl =w
use strict;
use person;
use dog;

sub main()
{
        my $object = {"name" => "tom"};

        # 先把"tom"变为人
        bless($object, "person");
        $object->sleep();
        $object->study();

        # 再把"tom"变为狗
        bless($object, "dog");
        $object->sleep();
        $object->bark();

        # 最后,再把"tom"变回人
        bless($object, "person");
        $object->sleep();
        $object->study();
}

&main();

# 程序运行时输出:
# tom is person, he is sleeping
# tom is person, he is studying
# tom is dog, he is sleeping
# tom is dog, he is barking
# tom is person, he is sleeping
# tom is person, he is studying


bless.wrong.pl


[Copy to clipboard] [ - ]
CODE:
#!/usr/bin/perl =w
use strict;
use person;
use dog;

sub main()
{
        my $object = {"name" => "tom"};

        # 没有把类型信息和$object绑定,因此无法获知$object有sleep方法
        $object->sleep();
        $object->study();
}

&main();

# 程序运行输出为:
# Can't call method "sleep" on unblessed reference at bless.wrong.pl line 10.


使用c++实现bless的功能

c中的代码

[Copy to clipboard] [ - ]
CODE:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct object {
        char name[16];
};

struct person {
        char name[16];

        void sleep() { printf("%s is person, he is sleeping\n", this->name); }
        void study() { printf("%s is person, he is studying\n", this->name); }
};

struct dog {
        char name[16];

        void sleep() { printf("%s is dog, he is sleeping\n", this->name); }
        void bark() { printf("%s is dog, he is barking\n", this->name); }
};

#define bless(object, type) ((type*) object)

int main()
{
        struct object * o = (struct object *) malloc(sizeof(struct object));
        strcpy(o->name, "tom");

        // 先把"tom"变为人
        bless(o, person)->sleep();
        bless(o, person)->study();

        // 再把"tom"变为狗
        bless(o, dog)->sleep();
        bless(o, dog)->bark();

        // 最后,再把"tom"变回人
        bless(o, person)->sleep();
        bless(o, person)->study();
        return 0;
}

// 程序运行时输出:
// tom is person, he is sleeping
// tom is person, he is studying
// tom is dog, he is sleeping
// tom is dog, he is barking
// tom is person, he is sleeping
// tom is person, he is studying

关键的地方就是把对象o的类型转变为person类型和dog类型

."".    ."",
     |  |   /  /
     |  |  /  /
     |  | /  /
     |  |/  ;-._
     }  ` _/  / ;         恭喜!!!
     |  /` ) /  /
     | /  /_/\_/\
     |/  /      |
     (  ' \ '-  |
      \    `.  /
       |      |
        |      |


QUOTE:
原帖由 royalzhang 于 2007-8-24 14:34 发表
."".    ."",
     |  |   /  /
     |  |  /  /
     |  | /  /
     |  |/  ;-._
     }  ` _/  / ;         恭喜!!!
     |  /` ) /  /
     | /  /_/\_/\
     |/  /      |
     (  ' \ '-   ...

谢谢,我已经跨入OO编程了,呵呵。
厉害,学习了.
楼主适合写程序啊,一上来就问的人得好好学学,其实知识就在身边,看你关心不关心而已。
接去,Perl有意思的东西多着呢,特别是写“严格”程序的人,保证越琢磨越有味,不过要用来写商品软件就要先想好了,毕竟……。
还以为bless只能用在.pm文件中呢!


QUOTE:
原帖由 pengchy 于 2007-8-25 12:46 发表
还以为bless只能用在.pm文件中呢!

perl的bless关键字对初学者是一个难点,部分原因就是bless的"英文含义"与它perl中的含义毫无关联,可以说是“驴头不对马嘴”!


QUOTE:
原帖由 DennisRitchie 于 2007-8-27 02:02 发表

perl的bless关键字对初学者是一个难点,部分原因就是bless的"英文含义"与它perl中的含义毫无关联,可以说是“驴头不对马嘴”!

拜托放轻松一些,编程也不要总是正襟危坐好不好?
怎么能说bless与它在perl中的含义毫无关联呢?
一个死气沉沉的引用,经过赐福,就神气活现地具有了某种灵性,这个词难道用的还不好吗?


QUOTE:
原帖由 福瑞哈哥 于 2007-8-27 11:15 发表


拜托放轻松一些,编程也不要总是正襟危坐好不好?
怎么能说bless与它在perl中的含义毫无关联呢?
一个死气沉沉的引用,经过赐福,就神气活现地具有了某种灵性,这个词难道用的还不好吗?

同意,我也是这么理解的。
我的理解就直接是bless大致相当于面向对象的构造器,虽然没这回事,但基本就这效果。

狂顶,很到位