[英]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.