如果我有一些東西的各種子類和一個對這些子類的實例進行操作的算法,並且如果算法的行爲根據實例的特定子類而略有不同,那麼最常用的面向對象方法就是這樣做的正在使用虛擬方法。何時使用運行時類型信息?
例如,如果子類是DOM節點,並且算法要插入子節點,則該算法根據父節點是DOM元素(可以有子元素)還是DOM文本(它可以是' t):所以insertChildren
方法可能在DomNode
基類中是虛擬的(或抽象的),並且在DomElement
和DomText
的子類中的每一箇中都有不同的實現。
另一種可能性是爲實例提供了一個公共屬性,其值可以被讀取:例如,該算法可能會讀取DomNode
基類的nodeType
屬性;或者作爲另一個例子,你可能有不同的網絡數據包類型(子類),它們共享一個公共數據包頭,你可以讀取數據包頭來查看它是什麼類型的數據包。
我沒有使用運行時類型信息很多,其中包括:
- 在C#
- 在點網溯造型
- 的Object.GetType法
is
和as
關鍵字 - 在C++中的
typeid
運算符
當我添加新的算法m取決於子類的類型,我傾向於在類層次結構中添加一個新的虛擬方法。
我的問題是,什麼時候適合使用運行時類型信息而不是虛函數?
說RTTI已被棄用,這是一種最後的手段嗎? – ChrisW 2009-10-05 14:54:01
@ChrisW,它只是更難理解,執行起來更慢。它不被棄用,它只是其他方法更好:) – vava 2009-10-05 14:59:24
它沒有什麼理由變慢:RTTI可以存儲在類vtable中,就像虛擬函數指針一樣。我不知道爲什麼它更難理解,因爲通過檢查RTTI更加本地化的方式:例如,如果你看到「if(foo是Foo)」,那麼你知道什麼是被檢查的,而不去查看定義在幾個子類中的虛擬功能。 – ChrisW 2009-10-05 15:05:37