2009年2月17日星期二

实现一个新的Nebula3类

当实现一个新类时要做的第一个决定是该新类是继承Core::RefCounted类或者是一个传统的C++类。下面几点将有助于你找到答案:

1.如果新类打算使用Nebula3对象模型扩展的特性如refcounting,RTTI等等,那么它必须继承Core::RefCounted类。

2.如果新类是一个典型很小的帮助类或工具类,像一个动态数组类,一个数学向量类,或者其它类似的。那么它从Core::RefCounted继承下来也没有什么意义。

继承Core::RefCounted的类会有一些限制:

1.继承Core::RefCounted的类不能直接在本地C++上下文创建栈对象,因为栈对象的生命周期是由C++管理的(当离开当前C++上下文它们将自动销毁,这样就完全绕开了Nebula3的引用计数生命周期管理)。

2.继承Core::RefCounted的类只有一个默认的构造函数。

3.继承Core::RefCounted的类必须有一个虚拟的析构函数。

4.继承Core::RefCounted的类必须不能拷贝,因为这样将搞乱引用计数机制。

为了使用Nebula3对象模型特性,首先是要继承Core::RefCounted类,其次是要在新类的声明和头部文件注释一些额外的信息:

一个标准继承Core::RefCounted类的声明看起来像这样:

namespace MyNamespace
{
class MyClass : public Core::RefCounted
{
DeclareClass(MyClass);
public:
/// constructor
MyClass();
/// destructor
virtual ~MyClass();
...
};
RegisterClass(MyClass);

注意DeclaredClass()宏,默认构造函数和虚拟析构函数和在类声明外的RegisterClass()宏。DeclareClass()宏为实现RTTI和工厂机制在类声明中增加了一点点Nebula3特性信息。从程序员的角度来看DeclareClass()宏通常是隐藏在Nebula3对象模型内部,因此,对象模型内部可以在不影响已存在类的情况下被改变。RegisterClass()宏是可选的,它注册类到中心工厂对象。如果你知道类对象将永远不会通过字符串类名或fourcc代码创建,那么RegisterClass()宏可以被忽略。

在类的.cc文件中需要包含以下Nebula3特殊信息:

namespace MyNamespace
{
ImplementClass(MyNamespace::MyClass, 'MYCL', Core::RefCounted);
}

ImplementClass()宏注册了类的RTTI机制,第一个参数是C++类名(注意,类名必须包含命名空间)。第二个参数是的类的fourcc代码,fourcc代码在所有类中必须是唯一的(在程序启动时如果有2个类注册了相同的fourcc代码将会产生一个运行时错误)。第三个参数是父类的名称。这个被RTTI机制用来重建类树。

(说明:在N3的最新版本中DeclareClass改为__DeclareClass,ImplementClass改为__ImplementClasClass改为__RegisterClass)

原文:<<The Nebula Device 3 Document>>Implementing A New Nebula3 Class

[声明]:限于译者水平,文中难免错漏之处,欢迎各位网友批评指正;

没有评论:

发表评论