2012-06-24 30 views
1

好吧,我正在使用抽象類A進行項目工作。假設類a1,a2和a3全部從類A繼承,並且有一些附加方法可能對每個方法都是唯一的子類。現在,這些對象可以作爲用戶交互的結果與其他對象配對,但只有某些類型的對象可以配對,即對象B只能使用a1,對象C只能使用a2,並且用戶嘗試否則結果告訴他們他們不能。我當然希望避免使用instanceof,因爲這在很大程度上是不好的做法,但我認爲目前我有一個相當討厭的腦脹氣病例。我想在父類中添加一個getType()或者一些這樣的方法來返回一個對每個子類都唯一的字符串,但是這會讓人覺得陳腐。抓住班級名稱感覺非常相似。我對OO和多態原則有點生疏,所以我們歡迎提供建議。繼承和識別Java中的對象類型

+0

在這種情況下,我看不到任何使用instanceof的問題,當您在運行時使用它來檢查類型時,它被認爲是一種不好的做法,應該在編譯時檢查它們,但是您說它是用戶將做配對(因此運行時操作),所以instanceof似乎是一個不錯的選擇 – ilcavero

回答

0

我正在考慮在這種情況下使用泛型的解決方案。

要做到這一點,你需要定義存儲兩個值genericly像類

類對< K,V擴展A>

現在你會被添加到一個HashMap的所有類型對你可以有。當需要一對這種類型的時候,你會得到它的名字。

缺點:

你要添加到容器都希望對

你有一個名字相關聯的一對

注意,在一個巨大的規模,這將是一個壞的解決方案。

2

如果您真的不想使用instanceof,並且無論如何不能爲任何原因定義超出實例類的配對參數,請向抽象類添加一組設置新方法,以執行其中一個東西:

a)方法worksWithTypeB,worksWithTypeC等等,在適當的子類中定義它們。然而,這很像類型檢查。

b)將類型B和C將使用的方法傳遞給抽象類;通常在B和C可以使用的類中定義它們(假設B類使用a1.methodB,而C類使用a2.methodC),但是將它們定義爲拋出一個異常否則存在(所以a1.methodC拋出一個異常,就像a2.methodB一樣)。

雖然ilcavero說,在這種情況下,類型檢查沒有任何問題。