我知道,从理论上讲,你不能(也不应该)在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";
// ...
}
使用该代码,我得到了我最初想要的结果。
答案 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)
您可以随时将您的类声明为普通类(非静态),并使您的公共成员保持静态。