這是我在這裏的第一個問題:)多態性問題:如何檢查派生類的類型?
我知道我不應該檢查對象類型,而是使用dynamic_cast,但這並不能解決我的問題。我有類擴展名和接口,稱爲IExtendable和IInitializable,IUpdatable,ILoadable,IDrawable(最後四個基本相同)。如果Extension實現了IExtendable接口,它可以使用不同的擴展對象進行擴展。
問題是我想允許實現IExtendable的擴展只擴展到實現與原始擴展相同接口的擴展。
你可能不unerstand那件事情,所以我嘗試用代碼來解釋它:
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 to Extension來實現IExtendable和一些IUpdatable,ILoadable ...我不得不檢查是否要添加的Extension也實現了這些接口。所以在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並查看它是否返回空值...謝謝
謝謝,但我真的沒有看到IUpdateExtendable如何解決我的問題 – Martin 2010-03-27 21:24:05
@malymato:如果您爲每個「操作」創建了一個單獨的界面,那麼您的工作可以檢查該特定界面 - 不要嘗試去處理單個IExtendable接口。 – 2010-03-27 22:56:49