在C#中派生一个静态类

时间:2011-03-12 13:27:48

标签: c# static constants const

我知道,从理论上讲,你不能(也不应该)在C#中派生静态类,但我有一个案例,我认为我需要它......我想为A类定义一些静态常量并且,正如我很快发现的那样,你不能这样做所以我遵循了这个教程:http://msdn.microsoft.com/en-us/library/bb397677.aspx

所以,我有一个像这样的静态类:

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

然后,我有B类扩展A类并添加一些新的静态常量。我想做的是:

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

这样,可以使用ClassBConstants.ConstantA或ClassBConstants.ConstantD访问这四个常量。但是,C#不会让我这样做。

我怎样才能做到这一点?也许解决方案完全不同,我不在乎它是否完全不使用静态常量,只要结果是我想要的。


编辑:

感谢Amby,我发现常量是隐式静态的,所以我真的不需要创建那些人工静态类(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";

    // ...

}

使用该代码,我得到了我最初想要的结果。

4 个答案:

答案 0 :(得分:2)

您不能从静态类派生。

如果两个类都在您的控制之下,您可以随时合并它们(假设这不会破坏其他人的代码)。

如果不是,那么为什么你要给人的印象是B类包含它真的没有的功能?

最后,如果您真的想要走这条路线,可以选择将类A中的静态成员复制/粘贴到类B中。但我个人认为那将是一个糟糕的电话。

答案 1 :(得分: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";
}

但我不认为你真的需要这样做。

答案 2 :(得分:0)

选择Singleton而不是静态类。 然后,您的类受益于非静态类可用的功能,用户只需进行以下更改:

ClassAConstants.ConstantA ...到

ClassAConstants.Instance.ConstantA
顺便说一下,如果你只是对consts感兴趣,那么下面的代码也会编译。然后,您可以从这些类的实例访问这些常量,或直接使用类名(如访问静态成员)。

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";
}

因为,consts是隐式的。

ClassAConstants.ConstantA ..有效。

ClassBConstants.ConstantA ..有效。

答案 3 :(得分:0)

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