это мой первый вопрос здесь:)
Я знаю, что не должен проверять тип объекта, но вместо этого использовать 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();
};
И я хочу разрешить этому классу расширяться только с помощью расширений, которые реализуют те же интерфейсы (или менее). Например, я хочу, чтобы он мог использовать Extension, который реализует IUpdatable; или как IUpdatable, так и IDrawable; но например не расширение, которое реализует ILoadable. Я хочу сделать это, потому что, например, когда Update () будет вызываться для некоторого Расширения, которое реализует IExtendable и IUpdateable, оно также вызывается для этих Расширений, которые расширяют это Расширение.
Поэтому, когда я добавляю некоторое расширение к расширению, которое реализует 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 ... спасибо