[英]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”的成員
您可以通過以下兩種主要方法解決此問題:
用不同的參數定義靜態方法:
public class Logger { public void Log(string message) { ... } public static void Log(string message, int level) { ... } }
遵循“單例”模式:
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接口的許多實現。 例如,您甚至可以考慮將Logger
類ILogger
靜態(不實現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.