我問了一個similar question yesterday,這是一種技術特有的,但現在我發現自己在廣泛意義上對這個主題感到疑惑。基於RTTI或基類修改的基礎或子類法案
爲了簡便起見,我們有兩個類,A和B,其中B是由A,B衍生真正的「是」 A,和所有A中所定義的例程具有相同的含義B.
假設我們想要顯示一個As列表,其中一些實際上是Bs。當我們遍歷As的列表時,如果當前對象實際上是一個B,我們想要顯示一些Bs附加屬性....或者我們只是想要區分Bs的顏色,但A和B都沒有任何概念「顏色」或「顯示內容」。
解決方案:
使A類由基本上包括一個稱爲ISB中的方法,()返回假半知道B的。 B將重寫該方法並返回true。顯示代碼將具有如下檢查:if(currentA.isB())B b = currentA;
在A中提供一個顯示()方法,B可以覆蓋....但是然後我們開始合併UI和模型。我不會考慮這個,除非有一些很酷的技巧我沒有看到。
使用instanceof來檢查,如果要顯示的對象的當前確實是一個B.
距離b。添加所有的垃圾,以A,即使它並不適用於A.基本上只包含A中的B(不從A繼承)並將其設置爲null,直到它適用。這有點吸引人。這與#1相似,我猜是有繼承的構成。
看起來這個問題似乎應該不時出現,並有一個明顯的解決方案。
所以我想這個問題,也許真的可以歸結爲:
如果我有一個由延伸的基類,添加新的功能(不只是改變了基類的現有行爲)的子類,是我在做一些悲慘的事情?當我們嘗試對可能是A或B的對象集合進行操作時,它似乎立即崩潰。
第二段的+1。這是需要區分的外部代碼,因爲兩個類不關心。一個班級責任,而您的班級(層級)責任不是選擇在窗口中使用的顏色。 – 2009-04-18 09:26:25