【Perl学习笔记】2. perl中的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 sleeping
# 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, 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
【Perl学习笔记】2. perl中的bless理解的更多相关文章
- 并发编程学习笔记(4)----jdk5中提供的原子类及Lock使用及原理
(1)jdk中原子类的使用: jdk5中提供了很多原子类,它会使变量的操作变成原子性的. 原子性:原子性指的是一个操作是不可中断的,即使是在多个线程一起操作的情况下,一个操作一旦开始,就不会被其他线程 ...
- [学习笔记] 在Eclipse中导入项目
参考前文:[学习笔记] 在Eclips 中导出项目 选择已经导出的文件: 导入之后,项目结构如下: 至此,完成.
- CockroachDB学习笔记——[译]CockroachDB中的SQL:映射表中数据到键值存储
CockroachDB学习笔记--[译]CockroachDB中的SQL:映射表中数据到键值存储 原文标题:SQL in CockroachDB: Mapping Table Data to Key- ...
- [学习笔记] 在Eclipse中导出可以直接运行的jar,依赖的jar中的类解压后放在运行jar中
前文: [学习笔记] 在Eclipse中导出可以直接运行的jar,依赖的jar打在jar包中 使用7z打开压缩包,查看所有依赖的jar都被解压以包名及class的方式存储在了运行jar中,此时jar的 ...
- [学习笔记] 在Eclipse中导出可以直接运行的jar,依赖的jar打在jar包中
本文需要参考前文: [学习笔记] 在Eclipse中导出可以直接运行的jar,依赖的jar在子目录中 上文是导出的运行的依赖jar被放在了子目录中,本文是将依赖jar放在可运行jar的本身,这样发布的 ...
- [学习笔记] 在Eclipse中导出可以直接运行的jar,依赖的jar在子目录中
工程创建可参考前文: [学习笔记] 在Eclipse中使用Hibernate,并创建第一个工程,数据库为Oracle XE 在工程上鼠标右键: 找到java 选择 Runable JAR file N ...
- Web安全学习笔记 SQL注入中
Web安全学习笔记 SQL注入中 繁枝插云欣 --ICML8 权限提升 数据库检测 绕过技巧 一.权限提升 1. UDF提权 UDF User Defined Function,用户自定义函数 是My ...
- Perl 学习笔记-标量数据
最近学习Perl, 准备看一遍入门指南,关键的东西还是记录下来,以便以后复习和查看参考. 笔记来自<<Perl语言入门第5版>> 1. 在Perl内部,不区分整数值和浮点数值, ...
- Perl 学习笔记-高级控制结构
1.unless控制结构 类似于独立的else语句; 要么条件为真, 要么执行语句块内的代码; unless(<condition>){code...;} 等价于 if(<con ...
- Perl 学习笔记-列表和数组
笔记来自<<Perl语言入门第5版>> 1. Perl中列表指标量的有序集合,数组则是存储列表的变量, 这两个术语经常混用,不过更精确地说,列表指数据,而数组指变量.数组的表示 ...
随机推荐
- VHDL设计时参数定义的方法 例子
-- SPtb LIBRARY ieee; USE ieee.std_logic_1164.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; USE IEEE.STD_LOGIC_ ...
- Fidder 工具使用
Fiddler是最强大最好用的Web调试工具之一,它能记录所有客户端和服务器的http和https请求,允许你监视,设置断点,甚至修改输入输出数据. 使用Fiddler无论对开发还是测试来说,都有很大 ...
- ODI性能问题
在这里分析下最近分析和解决ODI性能问题的点滴,用作参考.在介入该问题前,已经具备的基础知识包括了ODI基础,SOA理论和实施,特别是04年封闭四天的informatic ETL培训和实操.几 ...
- 专题合集:深入Android媒体存储服务
Android 有一套媒体存储服务,进程名是 android.process.media,主要负责把磁盘中的文件信息保存到数据库当中,供其他 APP 使用以及 MTP 模式使用.这里包含了数据库管理. ...
- Bash debug
Debugging bash scripts Bash can help us to find problems in bash scripts in some ways. You don't exp ...
- Qt窗口的标题栏自绘
因个人需要,要修改Qt Widget的标题栏,网上找了大半天,没有得到答案,但发现问的人比较多 所以现将找到的此文分享一下. (原文:http://www.qtsoftware.com/develop ...
- CSV 客座文章系列:KGroup 通过 Windows Azure 将 Qoob 内容管理发布到云中
编辑人员注释: 今天这篇文章由 KGroup 首席软件架构师兼研发部主管 Jody Donetti 与 KGroup 技术总监 Simone Procopio 共同撰写,介绍了 KGroup 如何使用 ...
- 网易云课堂_C语言程序设计进阶_第6周:程序结构
6.1 全局变量 6.2 编译预处理 6.3 大程序结构 6.1 全局变量 全局变量 定义在函数外面的变量是全局变量 全局变量具有全局的生存期和作用域 它们与任何函数都无关 在任何函数内部都可以使用它 ...
- python访问cloudstack的api接口
1.CloudStack API 如同 AWS API 一样,CloudStack API 也是基于 Web Service,可以使用任何一种支持 HTTP 调用的语言(例如 Java,python, ...
- 设计模式- 主动对象(Active Object)
译者注:1.对象分为主动对象和被动对象,主动对象内部包含一个线程,可以自动完成动作或改变状态,而一般的被动对象只能通过被其他对象调用才有所作为.在多线程程序中,经常把一个线程封装到主动对象里面.2.在 ...