[wm4] LibGraphics/ObjectSystem/Wm4Rtti
2010-01-29 08:56:28| 分类:
3d_WildMagic
| 标签:
|举报
|字号大中小 订阅
WildMagic 4 的代码还是相当简明、清晰的,让人看起来很舒服。
RTTI 在 ObjectSystem 中的实现很简洁,也很传统。
每个继承于 Wm4::Object 的 class,都会带上一个 Wm4::Rtti,由其形成继承树。比如:
Object.Rtti
/ \
Spatial.Rtti Control.Rtti
|
Node.Rtti
用法如下:
class MyFoo {
WM4_DECLARE_RTTI;
};
// Wm4 - namespace
// Spatial - class name
// Object - base class name
WM4_IMPLEMENT_RTTI(Wm4,Spatial,Object);
下面给个具体的小例子,看看如何运用之。
---------------------------------------------------------------
// Object
// |
// MyBase
// / \
// MyFoo1 MyBar
// |
// MyFoo2
#include <Wm4Object.h>
#include <iostream>
namespace Wm4
{
class MyBase : public Object
{
public:
WM4_DECLARE_RTTI;
};
WM4_IMPLEMENT_RTTI(Wm4, MyBase, Object);
class MyFoo1 : public MyBase
{
public:
WM4_DECLARE_RTTI;
};
WM4_IMPLEMENT_RTTI(Wm4, MyFoo1, MyBase);
class MyFoo2 : public MyFoo1
{
public:
WM4_DECLARE_RTTI;
};
WM4_IMPLEMENT_RTTI(Wm4, MyFoo2, MyFoo1);
class MyBar : public MyBase
{
public:
WM4_DECLARE_RTTI;
};
WM4_IMPLEMENT_RTTI(Wm4, MyBar, MyBase);
}
int main()
{
Wm4::Object *base = WM4_NEW Wm4::MyBase;
Wm4::Object *foo1 = WM4_NEW Wm4::MyFoo1;
Wm4::Object *foo2 = WM4_NEW Wm4::MyFoo2;
Wm4::Object *bar = WM4_NEW Wm4::MyBar;
std::cout << "MyFoo1.IsExactlyTypeOf(MyBase) = " << foo1->IsExactlyTypeOf(base) << std::endl;
std::cout << "MyFoo1.IsDerivedTypeOf(MyBase) = " << foo1->IsDerivedTypeOf(base) << std::endl;
std::cout << "MyFoo2.IsExactlyTypeOf(MyBase) = " << foo2->IsExactlyTypeOf(base) << std::endl;
std::cout << "MyFoo2.IsDerivedTypeOf(MyBase) = " << foo2->IsDerivedTypeOf(base) << std::endl;
std::cout << "MyBar.IsExactlyTypeOf(MyBase) = " << bar->IsExactlyTypeOf(base) << std::endl;
std::cout << "MyBar.IsDerivedTypeOf(MyBase) = " << bar->IsDerivedTypeOf(base) << std::endl;
std::cout << "MyFoo2.IsExactlyTypeOf(MyFoo1) = " << foo2->IsExactlyTypeOf(foo1) << std::endl;
std::cout << "MyFoo2.IsDerivedTypeOf(MyFoo1) = " << foo2->IsDerivedTypeOf(foo1) << std::endl;
std::cout << "MyFoo2.IsExactlyTypeOf(MyBar) = " << foo2->IsExactlyTypeOf(bar) << std::endl;
std::cout << "MyFoo2.IsDerivedTypeOf(MyBar) = " << foo2->IsDerivedTypeOf(bar) << std::endl;
return 0;
}
---------------------------------------------------------------
$ ./a.out
MyFoo1.IsExactlyTypeOf(MyBase) = 0
MyFoo1.IsDerivedTypeOf(MyBase) = 1
MyFoo2.IsExactlyTypeOf(MyBase) = 0
MyFoo2.IsDerivedTypeOf(MyBase) = 1
MyBar.IsExactlyTypeOf(MyBase) = 0
MyBar.IsDerivedTypeOf(MyBase) = 1
MyFoo2.IsExactlyTypeOf(MyFoo1) = 0
MyFoo2.IsDerivedTypeOf(MyFoo1) = 1
MyFoo2.IsExactlyTypeOf(MyBar) = 0
MyFoo2.IsDerivedTypeOf(MyBar) = 0
---------------------------------------------------------------
评论这张
转发至微博
转发至微博
评论