在 C# 中派生静态类

mig*_*rso 2 c# static constants

我知道,理论上,你不能(也不应该)在 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";
}
Run Code Online (Sandbox Code Playgroud)

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

public static class ClassBConstants : ClassAConstants
{
    public const string ConstantC = "constant_c";
    public const string ConstantD = "constant_d";
}
Run Code Online (Sandbox Code Playgroud)

这样,这四个常量就可以通过 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";

    // ...

}
Run Code Online (Sandbox Code Playgroud)

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

Man*_*ani 5

选择单例而不是static类。然后,您的班级可以从非static班级可用的功能中受益,并且用户只需进行以下更改:

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";
}
Run Code Online (Sandbox Code Playgroud)

这是可能的,因为consts 是隐式的static

ClassAConstants.ConstantA..有效。

ClassBConstants.ConstantA..有效。