我想創建一組共享許多常見行爲的類。當然,在OOP中,當你認爲自動思考「帶有子類的抽象類」時。但是我希望這些類所要做的事情是每個類都有一個靜態的類實例列表。該列表應該在類中作爲一個單例。我的意思是每個子類都有一個單身人士,而不是他們分享一個。 「單身」到那個小類,不是一個真正的單身人士。但如果它是靜態的,我該如何繼承它?我如何製作一個單身家庭?
當然像這樣的代碼將無法正常工作:
public abstract A
{
static List<A> myList;
public static List getList()
{
if (myList==null)
myList=new ArrayList<A>(10);
return myList;
}
public static A getSomethingFromList()
{
List listInstance=getList();
... do stuff with list ...
}
public int getSomethingFromA()
{
... regular code acting against current instance ...
}
}
public class A1 extends A
{
...
}
public class A2 extends A
{
...
}
A1 somethingfromA1List=(A1) A1.getSomethingFromList();
A2 somethingfromA2List=(A2) A2.getSomethingFromList();
每個子類的列表中的內容會有所不同,但所有的代碼在名單的工作將是相同的。
上述代碼的問題是,我只有一個列表的所有子類,我想爲每個。是的,我可以複製代碼來在每個子類中聲明靜態列表,但是我還必須複製添加到列表中的所有代碼並搜索列表等,這相當於破壞了子類化的目的。
有關如何在不復制代碼的情況下執行此操作的任何想法?
更新
澄清BlueRaja,也許別人,讓我成爲一個更具體一點什麼,我試圖做的。
我有一些需要類似行爲的狀態和代碼。它們就像枚舉一樣,我希望爲每個可能的代碼狀態提供類型安全的實例,但是它們有多個集合,所以我不能只爲它們製作一個枚舉。
因此,例如我有訂單狀態,它具有按順序,發貨,收到的值和一些特殊值。我有物品類型,商品與服務的價值。我有股票與習俗。等
如果這就是它,我只是爲每個枚舉。但是,我還需要其他行爲,例如通過文本值查找對象的能力,例如,當我們從數據庫中讀取它時;建立一個下拉列表,通過文字描述列出所有的選擇;等等。據我所知,我不能用枚舉來做這件事,因爲我有幾組代碼,每個代碼都有我想要繼承的常見行爲,並且我不能繼承一個枚舉。將所有代碼放在一個枚舉中會放棄一個代碼相對於另一個代碼的類型安全性,也沒有證明爲特定代碼類型收集值列表的現成方法。
不要在對象orietented世界中使用靜態持有狀態,這只是錯誤的。 – 2010-05-03 13:53:10
不要使用單例,對靜態數據要非常小心。比繼承更喜歡構圖。 真的,你提到的幾乎沒有什麼是真正的「良好的面向對象」。 – jalf 2010-05-03 14:00:32
好的。所以我有一組給定子類的實例,並且我需要維護一個所有這些實例的列表以供搜索,構建下拉列表等。好的,我可以創建一個包含列表的(非靜態)對象。但只有一個列表纔有意義。那有什麼好處呢?如果我用不同的列表創建兩個對象,那麼有些事情是錯誤的。如果沒有單身人士,你會如何解決問題? – Jay 2010-05-03 16:48:45