北大侠客行MUD论坛

 找回密码
 注册
搜索
热搜: 新手 wiki 升级
查看: 5938|回复: 0

轻轻松松学PIKE 之二(zz)

[复制链接]
发表于 2004-6-18 18:25:49 | 显示全部楼层 |阅读模式
作者:super 更新日期:2004-01-16 类别:MUD文档->技术资料 总浏览/今日:2/1
轻轻松松学PIKE 之二
-----复杂而又简单的PIKE

由于这一系列文章面向的读者是已经有一定的编程基础的LPC程序员。
所以一些基本的语法或者基本概念在这里将不做详细介绍。

下面我们来看一看PIKE里面的面向对象思想。

在PIKE里面,除了直接执行的程序以外,任何一个代码都可以看成是
一个物件。跟LPC不同的是,PIKE里面所有物件里面的任何局部变量
都可以直接访问,其访问方式类似与mapping这种数据结构。
下面举个例子:
//aaa.pike
mapping a;
int b;
void aa();
...

然后我在另外一个程序里面写:
object ob = ((program)"aaa.pike")();
那么这个时候,假如我们要执行ob里面的aa()这个函数有两个路径。
第一,执行ob->aa();
第二,执行ob["aa"]();

这样让面向对象的观念变得十分的明显了,无论任何变量或者函数,都
是该物件的一种属性,这样更容易让人的思维所理解。由此一来,我们
在设计我们的PIKE代码的时候,能够更加直观的来实现。任何成员都可
以通过成员名来直接访问,不管成员的类型是什么。

在PIKE里面,淡化了函数这一概念,使其变得更加随意了,下面来看个
例子:
//aaa.pike
void aa() {...}

然后我在另外一个程序里面:
object ob = ((program)"aaa.pike")();
这个时候我们用ob->aa来访问aa这个成员,并且可以用
ob->aa = bb(); //假如bb()是一个function类型。
这样的形式来给aa这个成员重新赋值。也就是说,在PIKE里面无论是
什么类型的成员,都可以通过->运算符进行访问和修改。那么这些看起
来似乎很有趣的思想,在实际应用中有什么用途呢?下面我就来展现一
段给物件动态增减函数的代码:
mapping efun = ([]);
void add_func(string fname,function f)
{
    efun[fname] = f;
}
function `->(string func)
{
    function f;
    if (f = this_object()[func]) return f;
    else return efun[func];
}
void del_func(string fname)
{
    if (!zero_type(efun[fname]))
          m_delete(efun,fname);
}
那么任何继承了这段代码的物件,都可以用ob->add_func(string,function);
和ob->del_func(string)这样的形式来增减外部函数。

这个时候也许大家会问,PIKE这样的特性是否会带来安全上的隐患呢?下
面我们就这个问题来讨论讨论。

我们可以通过对各种运算符进行重载,在重载中对各种情况进行判断。在
上一章节中我们讲过同一个文件生成的program是完全相同的,由此我们就
可以在重载过程中对object_program(this_object())的结果进行判断,从
而得出该object的源头,然后再做一些限制和相应的判断。由此说来,PIKE
的安全性能是要比LPC还要高的。

在下一章节里面,我们将介绍PIKE在工程建设中的优势和长项。
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|北大侠客行MUD ( 京ICP备16065414号-1 )

GMT+8, 2024-3-28 10:38 PM , Processed in 0.011418 second(s), 14 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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