我們經常聽到/讀到應該避免動態投射。根據你的意思,我想知道它會是什麼「好用」的例子?什麼是動態鑄造的一些'很好用'的例子?
編輯:
是的,我知道的that other thread:這的確是閱讀,答案到那裏的一個,我問我的問題的時候!
我們經常聽到/讀到應該避免動態投射。根據你的意思,我想知道它會是什麼「好用」的例子?什麼是動態鑄造的一些'很好用'的例子?
編輯:
是的,我知道的that other thread:這的確是閱讀,答案到那裏的一個,我問我的問題的時候!
我目前的玩具項目使用dynamic_cast兩次;曾經爲解決缺乏C++中的多次調度問題(這是一個訪問者風格的系統,可以使用多個調度而不是dynamic_casts),並且一次特殊情況下特定的子類型。
在我看來,這些都是可以接受的,儘管前者至少源於語言缺陷。事實上,我認爲這可能是一種常見的情況;大多數dynamic_casts(以及大量的「設計模式」)是針對特定語言缺陷的解決方法,而不是針對某些特定語言缺陷的解決方案。
通過C接口將句柄暴露給對象時,它可用於運行時類型安全位。讓所有公開的類從一個公共基類繼承。當接受函數的句柄時,首先將其轉換爲基類,然後將其動態轉換爲您期望的類。如果他們傳遞了一個非感性的句柄,那麼當運行時找不到rtti時會得到異常。如果他們傳入錯誤類型的有效句柄,則會得到一個NULL指針,並可能拋出自己的異常。如果他們通過正確的指針,你很好走。 這不是傻瓜,但它肯定比捕獲錯誤的調用庫更好,而不是直接從句柄重新解釋,並且等到某些數據在通過錯誤的句柄時被神奇地破壞。
這是我經常做的事情,雖然不太好,但它很簡單而且有用。
我經常和實現接口的模板,集裝箱工作, 想象像
template<class T>
class MyVector : public ContainerInterface
...
凡ContainerInterface已基本有用的東西,但僅此而已。如果我想在不暴露我的模板實現的情況下使用整數向量的特定算法,那麼在實現中接受接口對象並將其dynamic_cast接受到MyVector是非常有用的。例如:
// function prototype (public API, in the header file)
void ProcessVector(ContainerInterface& vecIfce);
// function implementation (private, in the .cpp file)
void ProcessVector(ContainerInterface& vecIfce)
{
MyVector<int>& vecInt = dynamic_cast<MyVector<int> >(vecIfce);
// the cast throws bad_cast in case of error but you could use a
// more complex method to choose which low-level implementation
// to use, basically rolling by hand your own polymorphism.
// Process a vector of integers
...
}
我可以添加一個Process()方法,將多態解決ContainerInterface,這將是一個更好的方法,面向對象,但我有時喜歡做這種方式。當你有簡單的容器,很多算法,並且你想隱藏你的實現時,dynamic_cast提供了一個簡單和醜陋的解決方案。
你也可以看看雙派遣技巧。
HTH
那麼它真的會很好用C#中的擴展方法。
例如,假設我有一個對象列表,我想從它們中獲取所有id的列表。我可以逐步通過它們並將它們拉出來,但我想分割出這些代碼以供重用。
所以像
List<myObject> myObjectList = getMyObjects();
List<string> ids = myObjectList.PropertyList("id");
會除了在擴展方法,你不會知道,在未來的類型涼爽。
所以
public static List<string> PropertyList(this object objList, string propName) {
var genList = (objList.GetType())objList;
}
將是真棒。
這個最近的線程給出了它派上用場的一個例子。有一個基本的Shape類和從它派生的類Circle和Rectangle。在測試平等時,很顯然Circle不能等於Rectangle,試圖比較它們將是一場災難。在遍歷指向Shapes的指針集合時,dynamic_cast會執行雙重任務,告訴您形狀是否可比,併爲您提供適當的對象以進行比較。
這是非常有用的,但是,大多數的時候是太有用:如果完成工作的最簡單的方法是做一個dynamic_cast的,它往往比的不是症狀糟糕的OO設計,反過來又可能以未知的方式導致未來的麻煩。
此問題的標題與說明不完全匹配。 – bradtgmurray 2009-07-07 20:06:01