由于C#没有为接口提供静态成员的支持,因此很难保证类中某些静态成员的存在。我知道它有抽象类 - 祖先,但我不能使用它,因为在这种情况下静态成员将是相同的。例如:
class StaticClass
{
protected static int _secretNumber = 10;
public static int SecretNumber { get { return StaticClass._secretNumber; } }
}
class SomeData : StaticClass
{
SomeData() { SomeData._secretNumber = 25; }
}
class SomeData2 : StaticClass
{
SomeData2() { SomeData2._secretNumber = 50; }
}
在这种情况下,StaticClass.SecretNumber = SomeData.SecretNumber = SomeData2.SecretNumber = 10。 为了保证类型包含自己的静态成员,我必须做些什么?
答案 0 :(得分:0)
简短回答 - 你不能。你为什么要这样?要访问这些字段,您必须直接引用它们(除非您使用反射),因此编译器会检查您。
你为什么要这样做?
如果您只想让子类分配变量,那么这是您在代码中无法指定的类的契约。使用文档来解释子类必须为此变量分配特定的数字。
答案 1 :(得分:0)
首先,“受保护的静态”是未经提及的,所以我会避免它。
其次,为什么不将“secretNumber”定义为实例,而不是静态?
我没有看到有“静态接口”的任何正当理由,除非您将使用反射。
答案 2 :(得分:0)
免责声明:我认为您提出的具有非常明显的气味
为了练习,他是部分问题的通用解决方案。有可能做你想做的一部分。实现我认为充其量只是设计错误的东西是一种诡计。但是作为一种代码练习,这种代码很有趣。
下面的代码不要求Derived初始化静态字段,但要确保任何派生类都有自己的实例。但是当使用静态成员时,您仍然必须通过具体类访问它。所以我看不出它是如何真正有用的
class BaseClass<T, K> where T : BaseClass<T, K>
{
protected static K _secret;
public static K Secret { get { return _secret; } }
}
class Derived : BaseClass<Derived, int>
{
static Derived()
{
_secret = 10;
}
}