熊与我为我倾倒以下简化代码:(我将描述该问题下面。)重构函数指针,以某种形式的模板
class CMyClass
{
...
private:
HRESULT ReadAlpha(PROPVARIANT* pPropVariant, SomeLib::Base *b);
HRESULT ReadBeta(PROPVARIANT* pPropVariant, SomeLib::Base *b);
typedef HRESULT (CMyClass::*ReadSignature)(PROPVARIANT* pPropVariant, SomeLib::Base *b);
HRESULT TryFormats(ReadSignature ReadFormat, PROPVARIANT* pPropVariant);
};
inline HRESULT CMyClass::ReadAlpha(PROPVARIANT* pPropVariant, SomeLib::Base *b)
{
if (b)
{
// got a valid Base. Handle generic stuff here.
SetStuff(pPropVariant, b->someInt);
return S_OK;
}
return (b != NULL) ? 0 : -1;
}
inline HRESULT CMyClass::ReadBeta(PROPVARIANT* pPropVariant, SomeLib::Base *b)
{
if (b)
{
SomeLib::FormatA *fa;
SomeLib::FormatB *fb;
if (fa = dynamic_cast<SomeLib::FormatA*>(b))
{
// specific code for FormatA
SetStuff(pPropVariant, fa->getVersion());
return S_OK;
}
else if (fb = dynamic_cast<SomeLib::FormatB*>(b))
{
// specific code for FormatB
SetStuff(pPropVariant, fb->valueForB);
return S_OK;
}
}
return (b != NULL) ? 0 : -1;
}
inline HRESULT CMyClass::TryFormats(ReadSignature ReadFormat, PROPVARIANT* pPropVariant)
{
HRESULT hr;
if (FAILED(hr = (this->*ReadFormat)(pPropVariant, _pFile->formatA())))
if (FAILED(hr = (this->*ReadFormat)(pPropVariant, _pFile->formatC())))
hr = (this->*ReadFormat)(pPropVariant, _pFile->formatD());
return hr;
}
我最终调用的代码,如:
hr = TryFormats(&CMyClass::ReadAlpha, pPropVar);
现在...问题是,这是太泛型和约束,特别是现在,我试图重构此代码在其他项目中使用。所以,这意味着我想将ReadXxx
代码放在另一个源文件中,并以某种方式滥用模板。 TryFormats
保留在类中,因为不同的类具有不同的格式,它们尝试读取。
我目前的做法是注定要失败的,由于所需要的功能dynamic_cast<Derived*>
不是在Base
类,因为我可能需要一个类来读取多达5名不同的格式,我真的不想拖累我首先不需要格式。 (例如,见上文CMyClass
如何不支持SomeLib::FormatB
,但ReadBeta()
需要支持它,因此迫使编译器编译所有相关信息。)总的来说,我有大约10种不同的格式,我'支持'这样。
我该如何正确重构这段代码?我不想为每个后代重写Base
功能,我也不想将派生的特定信息放入只需要Base
的函数中。
我已经尝试了一些东西,但是我设法从我的编译器中挤出的所有错误都是彩虹。我没有把这里的人们与我的企图混淆起来,而是想给出我的(简化的)原始工作准则,并让专家就如何做到这一点得出他们自己的结论。实际上,这些函数中大约有50个函数,但它们要么遵循上述函数的一般结构ReadAlpha
或ReadBeta
函数。所以如果有人能告诉我如何做到这一点,我可以没有问题转换我的实际代码。 (我想我需要更改TryFormats()
的定义,这也是没有问题的 - 我只是希望有人能告诉我如何得到上述示例重构正确。)
谢谢,我道歉很长很长的问题。
看到我的更新您的评论。希望有所帮助。 – 2009-11-20 15:13:53
你不会在同一句话中经常看到的词:过于笼统和约束 – 2009-11-20 16:33:53
@Doug:越多的想法越好! :) @马丁约克:真的。尽管如此,他们都适用于我。我认为问题的根源在于后代对于主要兴趣点已经非常一致地开始了,但是对于设计来说没有考虑次要(更具体的)信息来源......使得获得这样的信息无论格式是否真实混乱。 – Stigma 2009-11-20 20:03:55