2011-03-12 94 views
1

我知道,理論上,你不能(也不應該)在C#中派生靜態類,但我有一種情況,我認爲我需要它...我想定義一個數字A類的靜態常量,正如我很快就發現,你不能這樣做,所以我跟着這個教程:http://msdn.microsoft.com/en-us/library/bb397677.aspx在C#中導出一個靜態類#

所以,我有一個靜態類是這樣的:

public static class ClassAConstants 
{ 
    public const string ConstantA = "constant_a"; 
    public const string ConstantB = "constant_b"; 
} 

然後,我具有擴展類A並添加一些新的靜態常量的類B。我想這樣做是這樣的:

public static class ClassBConstants : ClassAConstants 
{ 
    public const string ConstantC = "constant_c"; 
    public const string ConstantD = "constant_d"; 
} 

這樣,四個常數將與ClassBConstants.ConstantA或ClassBConstants.ConstantD訪問。但是,C#不會讓我這樣做。

我該如何做到這一點?也許解決方案是完全不同的,我不在乎它是否根本不使用靜態常量,只要結果是我想要的。


編輯:

感謝去啦我發現常數是隱式靜態的,所以我真的沒有需要創建一個人工靜態類(ClassAConstants和ClassBConstants)。解決方案不能簡單:

public class A 
{ 
    public const string ConstantA = "constant_a"; 
    public const string ConstantB = "constant_b"; 

    // ... 

} 
public class B : A 
{ 
    public const string ConstantC = "constant_c"; 
    public const string ConstantD= "constant_d"; 

    // ... 

} 

通過該代碼,我得到了最初想要的結果。

+0

單身模式可以幫助你,如果你真的需要你有一個常規類的靜態實例 – Guillaume86 2011-03-12 13:31:34

+0

ClassBConstants IS-A ClassBConstants? – 2011-03-12 13:31:54

回答

0

選擇Singleton而不是靜態類。 然後從可用到非靜態類功能類的好處,並且用戶將只需要做以下修改:

ClassAConstants.ConstantA ...到

ClassAConstants.Instance.ConstantA 

順便說一句,如果你只insterested在常量中,那麼下面的代碼也會被編譯。然後你可以從這些類的實例中訪問這些常量,或者直接使用類名(比如訪問靜態成員)。

public class ClassAConstants 
{ 
    public const string ConstantA = "constant_a"; 
    public const string ConstantB = "constant_b"; 
} 

public class ClassBConstants : ClassAConstants 
{ 
    public const string ConstantC = "constant_c"; 
    public const string ConstantD = "constant_d"; 
} 

因爲,常量是隱式靜態的。

ClassAConstants.ConstantA ..作品。

ClassBConstants.ConstantA ..作品。

+0

「常量是隱式靜態的」好的,那真的是我需要的。如果我在類中聲明常量,沒有「靜態」它就像我最初想要的那樣工作。謝謝! – miguelSantirso 2011-03-12 14:09:50

2

你不能從靜態類派生。

如果這兩個類都在您的控制之下,您可以隨時合併它們(假設這不會破壞其他人的代碼)。

如果他們不是,那麼爲什麼你要給類似B類包含它真的沒有的功能的印象?

最後,如果您確實想要走這條路線,可以選擇將類A中的靜態成員複製/粘貼到B類中。但個人而言,我認爲這將是一個不好的呼叫。

+0

謝天謝地。 Eeeep。 – 2011-03-12 13:31:25

+2

@Jon一個人爲什麼想要派生靜態類有很多原因。如果我有ConstantsForVersion1和ConstantsForVersion2,如果它是一個超集,我可能想從V1導出V2。作爲常量,我可以簡單地複製它們,但我可能很懶,通常重複兩次相同的代碼是不好的做法。 – xanatos 2011-03-12 13:35:27

+0

@xanatos:當然,DRY很好。但不會引入不必要的耦合也很好(隨機示例:如果有人更改了「V1」的常量,該怎麼辦?)。但是+1因爲你是一名CLIPPER程序員;我在x86上的第一語言是CLIPPER :) – Jon 2011-03-12 13:38:43

2

你可以這樣做:

public static class ClassAConstants 
{ 
    public const string ConstantA = "constant_a"; 
    public const string ConstantB = "constant_b"; 
} 

public static class ClassBConstants 
{ 
    public static string ConstantA 
    { 
     get { return ClassAConstants.ConstantA; } 
    } 
    public static string ConstantB 
    { 
     get { return ClassAConstants.ConstantB; } 
    } 
    public const string ConstantC = "constant_c"; 
    public const string ConstantD = "constant_d"; 
} 

但我不認爲你真的需要做到這一點。

0

您可以隨時將您的類聲明爲普通類(非靜態),並使您的公共成員保持靜態。