首页>
知识库>
详情

Nebula2探秘03-ObjectSystem研究

2020-08-04 来源:CloudBest 阅读量: 0
关键词:

    首先要创建一个Nebula2符合ObjectSystem规范的类,下面代码创建了一个最简单的Nebula2类:
    /****************************************************************************/
    /* Nebula2 - Tutorial 03 */
    /* ObjectSystem探秘 */
    /* 实现了一个最简单的Nebula2对象 */
    /* author: happykevins */
    /****************************************************************************/
    #pragma once
    #include "kernel/nkernelserver.h"
    #include "kernel/nroot.h"
    /// Nebula对象的父类名(用于建立RTTI关联)
    extern const char* SuperClassName;
    /// Nebula对象的类名
    extern const char* ThisClassName;
    /// Nebula对象的初始化操作
    extern bool init_nebulaobj(nClass* clazz, nKernelServer* kernelServer);
    /// Nebula对象的创建操作
    extern void* 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类型的工作
    class NebulaObj : public nRoot
    {
    public:
    // constructor
    NebulaObj()
    {
    nKernelServer::Instance()->Print("[NebulaObj]Construct! ");
    }
    // destructor
    ~NebulaObj()
    {
    nKernelServer::Instance()->Print("[NebulaObj]Destruct! ");
    }
    // do something
    void DoSomething(const char* msg)
    {
    nKernelServer::Instance()->Print("[NebulaObj]%s ", msg);
    }
    };
    /// +NebulaObj
    ///----------------------------------------------------------------------------
    /****************************************************************************/
    /* Nebula2 - Tutorial 03 */
    /* ObjectSystem探秘 */
    /* 实现了一个最简单的Nebula2对象 */
    /* author: happykevins */
    /****************************************************************************/
    #include "NebulaObj.h"
    const char* SuperClassName = "nroot";
    const char* ThisClassName = "tutorialobj";
    /// Nebula对象的初始化操作
    bool init_nebulaobj(nClass* clazz, nKernelServer* kernelServer)
    {
    // 设置类名
    clazz->SetProperName(ThisClassName);
    // 设置类大小
    clazz->SetInstanceSize(sizeof(NebulaObj));
    // 让KernelServer来建立RTTI关联
    kernelServer->AddClass(SuperClassName, clazz);
    return true;
    }
    /// Nebula对象的创建操作
    void* new_nebulaobj()
    {
    return n_new(NebulaObj);
    }
    下面是将Nebula2Obj添加到KernelServer,并在NOH中创建该对象的代码:
    /****************************************************************************/
    /* Nebula2 - Tutorial 03 */
    /* ObjectSystem探秘 */
    /* author: happykevins */
    /****************************************************************************/
    ///----------------------------------------------------------------------------
    /// +链接库<B