Народ, помогите решить задачу.
У CComponentClass есть публичный шаблонный метод
template <class T>
BOOL GetBaseClass(T** ppT) const
{
for (CONST_ITER_CONT iter = vecOfBaseCont.begin(); iter != vecOfBaseCont.end(); ++iter)
{
CBLContext *pCont = *iter;
if (GetBaseClassFromContext(pCont, ppT))
return TRUE;
if (pCont->GetRuntimeClass() == RUNTIME_CLASS(CComponentClass))
{
if (static_cast<CComponentClass*>(pCont)->GetBaseClass(ppT))
return TRUE;
}
else
{
T* p = dynamic_cast<T*>(pCont);
if (p)
{
*ppT = p;
return TRUE;
}
}
}
return FALSE;
};
Который получает базовый класс, являющийся нужным типом.
Этот метод используется для наследников ТП и АктивИкс.
Второй день ничего в голову не приходит, кроме как описания 2-х отдельных методов для наследников ТП и АктивИкс, а точнее, спец.интерфейсов для них.
Вопрос: каким образом можно спрятать детали реализации класса (vecOfBaseCont и итераторы) для инкапсуляции и оставить шаблонную функцию рабочей.
Или я туплю?
PS Клиентский код, например, такой
CV7Control* pV7Control = NULL;
if (IS_BLTYPE(rValue, CComponentClass))
{
pUDC = rValue.GetContext();
if (!static_cast<CComponentClass*>(pUDC)->GetBaseClass(&pV7Control))
RuntimeError("Не удалось определить класс ЭУ среди родителей класса '%s'.", pUDC->GetTypeString());
}
else
{
pV7Control = dynamic_cast<CV7Control*>(rValue.GetContext());
if (!pV7Control)
RuntimeError("Класс '%s' не является ЭУ.", rValue.GetTypeString());
}