轻轻松松学PIKE 之二(zz)
作者: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 = f;
}
function `->(string func)
{
function f;
if (f = this_object()) return f;
else return efun;
}
void del_func(string fname)
{
if (!zero_type(efun))
m_delete(efun,fname);
}
那么任何继承了这段代码的物件,都可以用ob->add_func(string,function);
和ob->del_func(string)这样的形式来增减外部函数。
这个时候也许大家会问,PIKE这样的特性是否会带来安全上的隐患呢?下
面我们就这个问题来讨论讨论。
我们可以通过对各种运算符进行重载,在重载中对各种情况进行判断。在
上一章节中我们讲过同一个文件生成的program是完全相同的,由此我们就
可以在重载过程中对object_program(this_object())的结果进行判断,从
而得出该object的源头,然后再做一些限制和相应的判断。由此说来,PIKE
的安全性能是要比LPC还要高的。
在下一章节里面,我们将介绍PIKE在工程建设中的优势和长项。
页:
[1]