2011-03-12 99 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

您可以随时将您的类声明为普通类(非静态),并使您的公共成员保持静态。