簡體   English   中英

派生類的靜態初始化

[英]Static initialization of a derived class

以下程序的輸出是

base init
BaseMethod
derived init
DerivedMethod

例如,從派生類對b​​ase方法的調用會觸發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()的調用上初始化派生類的預期結果,但是它並不是很令人滿意,因為它是對每個公共靜態基方法都必須執行的無意義的“路由”代碼。

有什么建議么?

而不是使用static new bool InitClass()派生類,為什么不使用標准靜態構造函數?

  static bool init = false;

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

請參見C#靜態構造函數

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM