簡體   English   中英

C#:同名的普通和靜態void

[英]C#: normal and static void with same name

我想創建一個“日志”類。 將有一個主要的全局記錄器。 但是當網絡部分希望將某些內容記錄到其自己的記錄器中時,它應該可以。 我的想法是:logger類中的一個靜態logger實例和一個具有相同名稱的靜態void來記錄某些內容。 例:

Logger.log("ahaha");

將一些東西記錄到主記錄器中,

new logger().log("kdsjfklsjd");

將登錄到特殊記錄器。 這是我班級的代碼:

public class Logger
{
    public static Logger GlobalLogger = new Logger();

    public Logger()
    {
    }

    public void log(string message)
    {
    }

    public static void log(string message)
    {
        Logger.GlobalLogger.log(message);
    }
}

我想告訴代碼,當我想要Logger.GlobalLogger.log(message)時,應使用非靜態void(具有相同的名稱)

你不能那樣做。 您會得到編譯器錯誤:

類型“ Logger”已經定義了具有相同參數類型的名為“ Log”的成員

您可以通過以下兩種主要方法解決此問題:

  1. 用不同的參數定義靜態方法:

     public class Logger { public void Log(string message) { ... } public static void Log(string message, int level) { ... } } 
  2. 遵循“單例”模式:

     public class Logger { public void Log(string message) { ... } private static Logger globalLogger; public static Logger GlobalLogger { get { if (globalLogger == null) { globalLogger = new Logger(); } return globalLogger; } } } 

解決該編譯器錯誤的一種方法是添加一個接口:

public interface ILogger {
    void Log(string message);
}

public class Logger : ILogger {
    public static readonly ILogger GlobalLogger = new Logger();

    // explicit implementation allows the static and instance Log() to coexist peacefully
    void ILogger.Log(string message) { /* log */ }

    public static void Log(string message) { GlobalLogger.Log(message); }
}

這種模式的一個好處是可以輕松提供ILogger接口的許多實現。 例如,您甚至可以考慮將LoggerILogger靜態(不實現ILogger ),並制作一個單獨的GlobalLogger類:

public static class Logger {
    public static readonly ILogger Global = new GlobalLogger();

    public static void Log(string message) { Global.Log(message); }
}

public class GlobalLogger : ILogger {
    void Log(message) { /* log */ }
}

暫無
暫無

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

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