派生类的静态初始化

时间:2014-09-17 14:13:22

标签: c# static-methods

以下程序的输出是

base init
BaseMethod
derived init
DerivedMethod

例如,从派生类调用base方法会触发Base类的init存根,而不是Derived类的相同。

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine(Derived.BaseMethod());
        Console.WriteLine(Derived.DerivedMethod());
    }
}

class Base
{
    public static string BaseMethod() { return "BaseMethod"; }
    static bool init = InitClass();
    static bool InitClass()
    {
        Console.WriteLine("base init");
        return true;
    }
}

class Derived : Base
{
    public static string DerivedMethod() { return "DerivedMethod"; }
    static bool init = InitClass();
    static bool InitClass()
    {
        Console.WriteLine("derived init");
        return true;
    }
}

实际上,我的基类没有初始化需求,但我的派生类确实如此,并且我希望确保它在任何人以任何方式与类交互之前运行。不幸的是,大多数与它的交互是通过基类中定义的方法,如上例所示。

我可以改变Derived类来隐藏BaseMethod,如下所示:

class Derived : Base
{
    public static new string BaseMethod() { return Base.BaseMethod(); }
    public static string DerivedMethod() { return "DerivedMethod"; }
    static bool init = InitClass();
    static new bool InitClass()
    {
        Console.WriteLine("derived init");
        return true;
    }
}

这会产生在调用Derived.BaseMethod()时初始化派生类的预期结果,但它并不令人满意,因为它没有意义的路由'必须为每个公共静态基本方法完成的代码。

有什么建议吗?

1 个答案:

答案 0 :(得分:2)

而不是使用static new bool InitClass()的派生类,为什么不使用标准的静态构造函数?

  static bool init = false;

  static Derived()
    {
        Console.WriteLine("derived init");
        init = true;
    }

请参阅C# Static Constructor