Я новичок в общем программировании классов, так что, возможно, мой вопрос глупый - извините за это. Я хотел бы знать, возможно ли следующее, и если да, то как это сделать
У меня есть простой универсальный класс Provider, который предоставляет значения универсального типа:
template <class A_Type> class Provider{
public:
A_Type getValue();
void setSubProvider(ISubProvider* subProvider)
private:
A_Type m_value;
ISubProvider* m_subProvider;
};
Функция getValue должна возвращать m_value, если m_subProvider равен NULL. Но если SubProvider не равен Null, значение должно быть рассчитано классом SubProvider.
поэтому субпоставщик также должен быть универсального типа, но я создаю его как абстрактный класс без реализации:
template <class A_Type> class ISubProvider{
public:
virtual A_Type getValue() = 0;
};
теперь я хочу, чтобы фактические реализации ISubProvider были неуниверсальными! например, я хочу реализовать IntegerProvider, который возвращает тип Integer
class IntegerProvider : public ISubProvider{
int getValue(){return 123;}
};
и, возможно, StringProvider:
class StringProvider : public ISubProvider{
string getValue(){return "asdf";}
};
Теперь - как мне все это кодировать, чтобы я мог использовать
void setSubProvider(ISubProvider* subProvider)
Функция класса Provider только с субпоставщиком, который соответствует универсальному типу Provider?
например, если я создаю провайдера типа int:
Provider<int> myProvider = new Provider<int>();
тогда можно будет позвонить
myProvider.setSubProvider(new IntegerProvider());
но нельзя звонить
myProvider.setSubProvider(new StringProvider());
Надеюсь, вы понимаете мой вопрос и можете сказать, как правильно создать этот код:)
Спасибо!