如何保证一个类型中静态成员的存在?

时间:2011-09-22 12:34:31

标签: c# .net

由于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。 为了保证类型包含自己的静态成员,我必须做些什么?

3 个答案:

答案 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;
    }
}