Nebula2探秘03-Object System研究

Nebula2探秘03-Object System研究

happykevins文

首先要创建一个Nebula2符合ObjectSystem规范的类,下面代码创建了一个最简单的Nebula2类:

/****************************************************************************/
/*Nebula2-Tutorial03*/
/*ObjectSystem探秘*/
/*实现了一个最简单的Nebula2对象*/
/*author:happykevins*/
/****************************************************************************/
#pragmaonce

#include
"kernel/nkernelserver.h"
#include
"kernel/nroot.h"

///Nebula对象的父类名(用于建立RTTI关联)
externconstchar*SuperClassName;
///Nebula对象的类名
externconstchar*ThisClassName;
///Nebula对象的初始化操作
externboolinit_nebulaobj(nClass*clazz,nKernelServer*kernelServer);
///Nebula对象的创建操作
externvoid*new_nebulaobj();

///----------------------------------------------------------------------------
///+NebulaObj
///@note:
///1.Nebula2对象必须继承自Root类,因为整个NOH管理系统都是基于nroot的
///2.调用KernelServer的AddModule添加Nebula对象;需要为AddModule提供以下两个函数指针:
///a.bool(n_init_obj*)(nClass,nKernelServer)
///提供向KernelServer注册该对象的操作
///b.void*(n_new_obj*)():
///提供创建该对象实例的操作
///3.需要说明一点:Nebula对象是在调用AddModule时添加到类型列表的,而AddClass方法只是
///建立了Class的层次关系,为Nebula的RTTI系统(将在后面的章节说明)提供支持。
///而n_init_obj函数的主要工作就是建立RTTI的系统关联。
///4.为了编码简单,Nebula2提供了nNebulaUsePackage,nNebulaClass,nNebulaScriptClass等宏
///来替代手工添加Nebula类型的工作
classNebulaObj:publicnRoot
{
public:
//constructor
NebulaObj()
{
nKernelServer::Instance()
->Print("[NebulaObj]Construct! ");
}
//destructor
~NebulaObj()
{
nKernelServer::Instance()
->Print("[NebulaObj]Destruct! ");
}
//dosomething
voidDoSomething(constchar*msg)
{
nKernelServer::Instance()
->Print("[NebulaObj]%s ",msg);
}
};
///+NebulaObj
///----------------------------------------------------------------------------
/****************************************************************************/
/*Nebula2-Tutorial03*/
/*ObjectSystem探秘*/
/*实现了一个最简单的Nebula2对象*/
/*author:happykevins*/
/****************************************************************************/
#include
"NebulaObj.h"

constchar*SuperClassName="nroot";
constchar*ThisClassName="tutorialobj";

///Nebula对象的初始化操作
boolinit_nebulaobj(nClass*clazz,nKernelServer*kernelServer)
{
//设置类名
clazz->SetProperName(ThisClassName);
//设置类大小
clazz->SetInstanceSize(sizeof(NebulaObj));
//让KernelServer来建立RTTI关联
kernelServer->AddClass(SuperClassName,clazz);
returntrue;
}

///Nebula对象的创建操作
void*new_nebulaobj()
{
returnn_new(NebulaObj);
}

下面是将Nebula2Obj添加到KernelServer,并在NOH中创建该对象的代码:

/****************************************************************************/
/*Nebula2-Tutorial03*/
/*ObjectSystem探秘*/
/*author:happykevins*/
/****************************************************************************/

///----------------------------------------------------------------------------
///+链接库
#pragmacomment(lib,"wsock32.lib")
#pragmacomment(lib,"d_nkernel.lib")
///-链接库
///----------------------------------------------------------------------------

///----------------------------------------------------------------------------
///+必要头文件
#include"kernel/nkernelserver.h"
#include
"util/nstack.h"
#include
"util/nhashlist.h"
///-必要头文件
///----------------------------------------------------------------------------

///----------------------------------------------------------------------------
///+Tutorial的头文件
#include"NebulaObj.h"
///-Tutorial的头文件
///----------------------------------------------------------------------------

//KernelServer
nKernelServer*ks=NULL;

///----------------------------------------------------------------------------
///+打印当前NOH树
voidPrintNOH(nRoot*pRoot)
{
//内核加锁
ks->Lock();

//层次栈
//在开始时将根节点入栈
nStack<nRoot*>deepStack;
deepStack.Push(pRoot);

//遍历树
do
{
//获得当前栈顶元素
nRoot*obj=deepStack.Pop();

//打印该元素NOH名
if(obj->GetParent())
{
ks
->Print("%s ",obj->GetFullName().Get());
}
else
{
ks
->Print("%s ",obj->GetName());
}

//兄弟节点入栈
if(obj->IsLinked()&&obj->GetSucc())
{
deepStack.Push(obj
->GetSucc());
}

//第一个子节点入栈
if(obj->GetHead())
{
deepStack.Push(obj
->GetHead());
}

}
while(!deepStack.IsEmpty());

//内核解锁
ks->Unlock();
}
///-打印当前NOH树
///----------------------------------------------------------------------------

///----------------------------------------------------------------------------
///+打印当前Class列表
voidPrintClasses()
{
//内核加锁
ks->Lock();

//获得Class列表
constnHashList*classList=ks->GetClassList();
nHashNode
*node=(nClass*)classList->GetHead();

//遍历输出Class列表
do
{
nClass
*cls=(nClass*)node;
ks
->Print("%s ",cls->GetName());
node
=node->GetSucc();
}
while(node);

//内核解锁
ks->Unlock();
}
///-打印当前Class列表
///----------------------------------------------------------------------------

///----------------------------------------------------------------------------
///+在Kernel中创建一个类
voidCreateClass()
{
ks
->AddModule(ThisClassName,init_nebulaobj,new_nebulaobj);
}
///-在Kernel中创建一个类
///----------------------------------------------------------------------------

///----------------------------------------------------------------------------
///+创建类的实例
voidCreateInstance()
{
///我们要创建对象的指针
NebulaObj*obj=NULL;

///创建实例但不添加到NOH树中
obj=(NebulaObj*)ks->New(ThisClassName);
obj
->DoSomething("CreateInstancenotinNOH!");
///销毁对象
obj->Release();
obj
=NULL;

///创建实例并添加到NOH中
///在NOH树中的对象将在KernelServer关闭时自动被销毁
obj=(NebulaObj*)ks->New(ThisClassName,"/Tutorial/TutorialObj");
obj
->DoSomething("CreateInstanceinNOH!");

///从NOH中查询对象
obj=(NebulaObj*)ks->Lookup("/Tutorial/TutorialObj");
obj
->DoSomething("LookupmeinNOH!");
}
///-创建类的实例
///----------------------------------------------------------------------------

///----------------------------------------------------------------------------
///+Application
intmain(intargc,constchar**argv)
{
///创建KernelServer
ks=n_new(nKernelServer);

///打印Class列表
ks->Print("*****PureClassList***** ");
PrintClasses();

///打印NOH:"/"是NOH根的名称
ks->Print("*****PureNOHTree***** ");
PrintNOH(ks
->Lookup("/"));

///在Kernel中创建一个类
CreateClass();

///打印Class列表
ks->Print("*****ClassListAfterCreateClass:%s***** ",ThisClassName);
PrintClasses();

///创建类的实例
ks->Print("*****CreateInstanceTest***** ");
CreateInstance();

///打印NOH:"/"是NOH根的名称
ks->Print("*****NOHTreeAfterCreateInstance***** ");
PrintNOH(ks
->Lookup("/"));

///销毁KernelServer
ks->Print("*****ClosingKernelServerHere!***** ");
n_delete(ks);

getchar();
return0;
}
///-Application
///----------------------------------------------------------------------------
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值