需求是这样:
假设我有Class Base是一个对任何使用者都可见的接口基类,现在某个对外完全封闭的模块有Class A : public Base,Class B : public Base等A、B、C.....等一系列对Base类的拓展和实现。使用者只能获得 Base* 指针类型,却不知道是A、B、C还是D哪个子类的具体实现。
我们需要让使用者通过Base*指针同样能操作(get、set)A、B、C的属性...........在实际编程中,这种设计其实很有用,我可以无限让用户拓展他自己组织的子类,而只要通过Base指针进行操作,对外部封闭了具体类型。
那么这个怎么实现呢?这里介绍前段时间学习得来的属性机制
属性,顾名思义,很容易联想到成员变量。那么要做到以上需求主要基类提供一个注册属性的机制就够了,不管子类有和属性,都可以通过基类继续注册,然后对外暴露
假设我有Class Base是一个对任何使用者都可见的接口基类,现在某个对外完全封闭的模块有Class A : public Base,Class B : public Base等A、B、C.....等一系列对Base类的拓展和实现。使用者只能获得 Base* 指针类型,却不知道是A、B、C还是D哪个子类的具体实现。
我们需要让使用者通过Base*指针同样能操作(get、set)A、B、C的属性...........在实际编程中,这种设计其实很有用,我可以无限让用户拓展他自己组织的子类,而只要通过Base指针进行操作,对外部封闭了具体类型。
那么这个怎么实现呢?这里介绍前段时间学习得来的属性机制
属性,顾名思义,很容易联想到成员变量。那么要做到以上需求主要基类提供一个注册属性的机制就够了,不管子类有和属性,都可以通过基类继续注册,然后对外暴露
下面是属性基类的定义:
class PropertyBase
{
protected:
PropertyBase(const Ogre::String& name, const Ogre::String& description, PropertyType type)
: mName(name),mDescription(description),mType(type)
{}
PropertyBase(const PropertyBase& pro){}
void operator= (const PropertyBase& pro){}
public:
virtual ~PropertyBase(){}
const Ogre::String& getName() const { return mName; }
const Ogre::String& getDescription() const { return mDescription; }
PropertyType getType() const { return mType; }
static PropertyType getTypeForValue(const short& val) { return PROP_SHORT; }
static PropertyType getTypeForValue(const unsigned short& val) { return PROP_UNSIGNED_SHORT; }
static PropertyType getTypeForValue(const int& val) { return PROP_INT; }
.....
....
protected:
Ogre::String mName;
Ogre::String mDescription;
PropertyType mType;
};
下面是属性的定义:
template <typename T>
class Pro