C#:具有相同名称的正常和静态void
本文关键字:void 静态 | 更新日期: 2023-09-27 18:21:22
我想创建一个"log"类。将有一个主要事情的全局记录器。但是当网络部分想要将一些东西记录到它自己的记录器时,它应该能够。我的想法:记录器类中的静态记录器实例和一个同名的静态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(消息)时,它应该使用非静态的void(同名)
你不能那样做。你会得到编译器错误:
类型"Logger"已经定义了一个名为"Log"的成员,该成员具有相同的参数类型
你有两个主要的选择来解决这个问题:
-
定义具有不同参数的静态方法:
public class Logger { public void Log(string message) { ... } public static void Log(string message, int level) { ... } }
-
遵循"singleton"模式:
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
),并创建一个单独的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 */ }
}