【发布时间】:2011-02-01 14:11:44
【问题描述】:
这是我的第一个问题:)
我知道我不应该检查对象类型,而是使用 dynamic_cast,但这不能解决我的问题。
我有名为 Extension 的类和名为 IExtendable 和 IInitializable、IUpdatable、ILoadable、IDrawable 的接口(最后四个基本相同)。如果 Extension 实现了 IExtendable 接口,它可以用不同的 Extension 对象来扩展自己。
问题是我想允许实现 IExtendable 的扩展仅使用实现与原始扩展相同接口的扩展进行扩展。
你可能不明白这个混乱,所以我尝试用代码来解释它:
class IExtendable
{
public:
IExtendable(void);
void AddExtension(Extension*);
void RemoveExtensionByID(unsigned int);
vector<Extension*>* GetExtensionPtr(){return &extensions;};
private:
vector<Extension*> extensions;
};
class IUpdatable
{
public:
IUpdatable(void);
~IUpdatable(void);
virtual void Update();
};
class Extension
{
public:
Extension(void);
virtual ~Extension(void);
void Enable(){enabled=true;};
void Disable(){enabled=false;};
unsigned int GetIndex(){return ID;};
private:
bool enabled;
unsigned int ID;
static unsigned int _indexID;
};
现在想象一下我这样创建扩展的情况:
class MyExtension : public Extension, public IExtendable, public IUpdatable, public IDrawable
{
public:
MyExtension(void);
virtual ~MyExtension(void);
virtual void AddExtension(Extension*);
virtual void Update();
virtual void Draw();
};
我想让这个类只使用实现相同接口(或更少)的扩展来扩展自身。例如,我希望它能够采用实现 IUpdatable 的 Extension;或 IUpdatable 和 IDrawable ;但是例如不是实现 ILoadable 的扩展。 我想这样做是因为当例如Update() 将在一些实现 IExtendable 和 IUpdateable 的 Extension 上调用,它也将在扩展此 Extension 的这些 Extensions 上调用。
因此,当我向实现 IExtendable 和一些 IUpdatable、ILoadable 的扩展添加一些扩展时...我不得不检查将要添加的扩展是否也实现这些接口。所以在 IExtendable::AddExtension(Extension*) 我需要做这样的事情:
void IExtendable::AddExtension(Extension* pEx)
{
bool ok = true;
// check wheather this extension can take pEx
// do this with every interface
if ((*pEx is IUpdatable) && (*this is_not IUpdatable))
ok = false;
if (ok) this->extensions.push_back(pEx);
}
但是怎么做呢?任何想法什么是最好的解决方案?我不想使用 dynamic_cast 并查看它是否返回 null...谢谢
【问题讨论】:
标签: interface polymorphism types virtual dynamic-cast