2016-08-08 63 views
1

我正在開發一個個人項目,並且遇到了一個問題。使用虛擬方法的靜態抽象對象

我有一些對象具有相同的屬性,方法等。唯一不同的是它們的名稱,屬性值和方法的實現。他們還需要通用的方法默認實現。所以馬上,一個界面是不可能的。

所以我創建了一個包含屬性和「默認」方法的基類。但是這個基類需要抽象。這些方法是虛擬的,因此可以被覆蓋。

我需要它們是靜態的原因是對象將是其他對象的屬性。因此,例如,上面引用的對象是(爲了簡單起見)objX,objY,objZ。它們來源於它們的基礎,objW。

objContainer是一個完全不相關的對象,但它有一個objW類型的屬性,它是objX,objY,objZ的一個實例。

objX,objY和objZ將從不更改。它們的屬性將全部是隻讀的。因此objContainer實例的多個對象將具有objX,objY或objZ。

public class objContainer1 
{ 
    objW processor = new objY; 
} 
public class objContainer2 
{ 
    objW processor = new objY; 
} 

我該如何去做這件事?我想讓它們保持靜態,所以我沒有同一個對象的多個實例,當它們全部完全相同時,實際上是這樣。

我使用單身嗎?工廠模式?

我失去了這個方向(如果有的話)。也許我正在推翻它,並且有一個非常簡單的解決方案/

回答

6

您想要謹慎使用靜態類。靜態類有明顯的缺點,例如無法利用類繼承的多態特性,因爲你不能從靜態類繼承。唯一一次你想要使用靜態類的時候,實際上是當你有一些你想在整個應用程序中使用的相關工具時,你不需要維護任何狀態。想一下System.Math這個類,例如:一組數學函數,你可以在你的應用程序的任何地方使用它。擁有這個類的實例並沒有什麼意義,而且這將會非常繁瑣和不必要。

我會建議堅持非靜態類和創建這些類的實例。如果你只應該有一個類的實例,那麼你應該使用一個單例,就像你所建議的那樣。

+0

謝謝。跟進問題。如果所有對象都是具有公共代碼的單例,那麼他們是否有辦法繼承父類中的所有單例模式,同時仍然單獨是單例本身?我基本上希望派生類實現單例模式,而不必爲每個類重複它。 – ilyketurdles