我有一組類描述了一組邏輯框,它們可以容納東西並對它們執行操作。我有測試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