我想创建一个“日志”类。主要事物将有一个全局记录器。但是当网络部分希望将日志记录到自己的记录器时,它应该能够。我的想法:记录器类中的静态记录器实例和具有相同名称的静态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(具有相同的名称)
答案 0 :(得分:0)
你不能那样做。您将收到编译器错误:
类型'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;
}
}
}
答案 1 :(得分:0)
解决此编译器错误的一种方法是添加接口:
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 */ }
}