我有一组类描述了一组逻辑框,它们可以容纳东西并对它们执行操作。我有测试C++类的功能
struct IBox // all boxes do these
{
....
}
struct IBoxCanDoX // the power to do X
{
void x();
}
struct IBoxCanDoY // the power to do Y
{
void y();
}
我不知道什么是“最好的”或可能对这些类的客户端它只是“喜欢”的成语来处理这些可选功能
一)
if(typeid(box) == typeid(IBoxCanDoX))
{
IBoxCanDoX *ix = static_cast<IBoxCanDoX*>(box);
ix->x();
}
b)
IBoxCanDoX *ix = dynamic_cast<IBoxCanDoX*>(box);
if(ix)
{
ix->x();
}
C)
if(box->canDoX())
{
IBoxCanDoX *ix = static_cast<IBoxCanDoX*>(box);
ix->x();
}
d)不同类结构现在
struct IBox
{
void x();
void y();
}
...
box->x(); /// ignored by implementations that dont do x
E)相同,除了
box->x() // 'not implemented' exception thrown
六)明确的测试功能
if(box->canDoX())
{
box->x();
}
我肯定还有其他的了。
编辑:
只是为了让使用更清晰的情况下
我揭露这些东西通过交互式用户界面给最终用户。他们可以输入'make box do X'。我需要知道盒子是否可以做x。或者,我需要禁用“使当前框做X”命令
EDIT2:THX所有回答者
诺亚·罗伯茨指出,(一)不工作(解释了我的一些问题!)。 我落得这样做(b)和轻微变异
template<class T>
T* GetCurrentBox()
{
if (!current_box)
throw "current box not set";
T* ret = dynamic_cast<T*>(current_box);
if(!ret)
throw "current box doesnt support requested operation";
return ret;
}
...
IBoxCanDoX *ix = GetCurrentBox<IBoxCanDoX>();
ix->x();
,让UI管道处理很好地与例外(我不是真的抛出赤裸裸的字符串)。
我还打算探索游客
你正在处理指针......好像你忘了把'*'ehm ...无处不在?! – smerlin 2010-07-26 16:36:08
您是否需要在运行时选择不同的*框?也就是说,你需要运行时多态还是一切都可以在编译时解决?这是你必须回答的第一个问题,因为这会引导你进入动态或静态多态类型的解决方案(即继承和虚拟方法与模板) – 2010-07-26 17:13:47