Lpc的继承简介
2007/5/5 22:57:59
第一节 前言
通过上一章的阅读,你应该知道Lpc的函数的基本工作方式。你应该学
会如何声明和调用函数。更进一步,你应该有能力自己写函数定义,即
使你是首次接触Lpc。你知道了函数调用是如何执行的,函数必须有一个
返回值,除非是 void 类型的。
下面我们来看一个例子。看看巫师的工作室,可能几乎都有类似下面
的一段代码。(这个不同的 MudLib 是不一样的)
-----
void create();
inherit "/std/room";
void create()
{
room::create();
set( "short", "巫师工作室");
set( "long", "这是一片未曾开垦的土地,需要巫师的画笔去描绘。\n" );
set( "exits", ([
"trill" : "/u/trill/workroom",
]);
create_door("south", "时空之门", "north", 0);
setup();
}
-----
如果你理解了前面的几章,你应该能立刻指出几点:
1) create() 是一个函数的定义部分。"void create();" 是它的函数
声明,却有在 create() 里面有个 room::create() 没有声明。
2) 它调用了set(), create_door(), setup(),在代码中却没有声明。
3) 在第三行,既不是变量声明也不是函数声明,更不是函数定义。
这一章就是回答以下问题的:
1) room::create()是什么东西?
2) 函数 set(),create_door(),在哪里声明、哪里定义?
3) 第三行是什么东西?
第二节 面对对象编程(OOP)的继承
继承是面对对象编程的一个基本特性。它使你能写一些基本的代码能
以不同的方式被不同的程序使用。一个 MudLib 做的就是创建一些基本
的 Object ,在此基础上你能用他们创建自己特殊的 Object。
如果不得不写那些定义巫师工作室所必须的所有代码,你可能要写超
过 1000 行的代码,这样你才可能有这个 room 所需要的所有函数。如果
每个 room 都必须这么做的话,首先是浪费硬盘空间;其次,你写的代
码可能根本无法和别人的写的代码组合在一起,每个人对 room 扩展的
特性的各种函数搞出每个人自己的标准。比如,你可能把 room 的长描
述的接口函数叫做 GetLong(),别的巫师可能喜欢把它命名为 query_long()。
这个就是各个 MudLib 不兼容的根本问题,因为它们 Object 相互继承、
调用上使用不同的协议。
OOP 能克服上面的问题。在上面的例子中,你直接使用的函数都定义
在继承的叫做 "/std/room.c" 的 Object 里面了。它有所有那些 room 常
用的函数的定义。当你写创建一个特别的 room,你通过继承得到 room
的的基本的功能,通过加入你自己写的函数,这样就把它变成了一个独
特的 room 了。
OOP 通过继承不只是提高了代码的可重用性,而且它可以是你只关心
继承基本的 Object 后,那些特性需要改变的,而不用考虑那些东西是
需要的,就是说当你看到别人写好的 Object 时,发现已经很象你心中
所想的东西,就只有一点点不符合,那你所要做只是继承原先的 Object,
然后加入和想的那一点点不同的东西就可以了。
OOP 当然不只是继承,还有别的一些。但是对于我们现在是谈论继承
的最基本的概念。
第三节 继承是如何工作的?
还记得最开始提的三个问题吗?在这一节里面,将解答这些问题。
首先最后一个问题:
例子中的第三行:
-----
inherit "/std/room";
-----
是做什么?
我想到了现在,你应该你猜出来这一行确保你写的巫师工作室继承了
标准的 room: "/std/room.c" 的特性。通过继承获得标准 room 的功能,
你就可以使用那些已经在 "/std/room.c" 底下声明和定义好的所有函数。
这就是为什么你可以直接使用 set(), create_door() 这些函数的原因了。
在你自己写的函数 create(),你只要设置那些你要的值就可以了。这些
值使得你的 room 与众不同,但确保和别的 Object 能相互作用。
那
下一页
返回列表
返回首页
©2025 MUD游戏网_文字mud 电脑版
Powered by iwms