加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

perl中bless的理解

发布时间:2020-12-15 20:58:01 所属栏目:大数据 来源:网络整理
导读:bless有两个参数:对象的引用、类的名称。 类的名称是一个字符串,代表了类的类型信息,这是理解bless的关键。 所谓bless就是把 类型信息 赋予 实例变量。 程序包括5个文件: person.pm :实现了person类 dog.pm :实现了dog类 bless.pl : 正确的使用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
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
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
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 studying


bless.wrong.pl
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中的代码
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,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)->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 studying

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/liangrockman/archive/2010/06/16/5674168.aspx

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读