我很困惑,为什么new
运营商没有按照我的预期工作。C#中的新运营商不覆盖基类成员
注意:以下所有类都在相同的命名空间中定义,并在同一个文件中定义。
这个类允许你用一些提供的文本为写入控制台的任何内容加上前缀。
public class ConsoleWriter
{
private string prefix;
public ConsoleWriter(string prefix)
{
this.prefix = prefix;
}
public void Write(string text)
{
Console.WriteLine(String.Concat(prefix,text));
}
}
这里是一个基类:
public class BaseClass
{
protected static ConsoleWriter consoleWriter = new ConsoleWriter("");
public static void Write(string text)
{
consoleWriter.Write(text);
}
}
这里是一个实现类:
public class NewClass : BaseClass
{
protected new static ConsoleWriter consoleWriter = new ConsoleWriter("> ");
}
现在,这里的执行该代码:
class Program
{
static void Main(string[] args)
{
BaseClass.Write("Hello World!");
NewClass.Write("Hello World!");
Console.Read();
}
}
所以我预计产量将为
Hello World!
> Hello World!
但输出
Hello World!
Hello World!
我不明白为什么会这样。这是我的思维过程为所发生的事情:
- 的CLR调用
BaseClass.Write()
方法 - 的CLR初始化的
BaseClass.consoleWriter
成员。 - 的方法被调用,与所述
BaseClass.consoleWriter
可变
执行然后
- 的CLR调用
NewClass.Write()
- 的CLR初始化的
NewClass.consoleWriter
对象。 - 的CLR看到该实现使用
NewClass.consoleWriter
变量
我想这是怎样的继承结构在于BaseClass
,但该方法是通过
NewClass
)作品? 请有人能帮助我理解为什么这不起作用?
-
更新:
这种情况将工作如下(我是如何实现它)
public class LogBase
{
protected static TraceSource logger = new TraceSource("");
public static void Error (string text) { logger.WriteError(text); }
public static void Info (string text) { logger.WriteInformation(text); }
public static void Warning (string text) { logger.WriteWarning(text); }
public static void Verbose (string text) { logger.WriteVerbose(text); }
}
// DataAccess logging
public class DALog : LogBase
{
protected new static TraceSource logger = new TraceSource("DataAccess");
}
// BusinessObjects logging
public class BOLog : LogBase
{
protected new static TraceSource logger = new TraceSource("Objects");
}
// BusinessLogic logging
public class BLLog : LogBase
{
protected new static TraceSource logger = new TraceSource("Logic");
}
// WebUI logging
public class WebUILog : LogBase
{
protected new static TraceSource logger = new TraceSource("WebUI");
}
的原因是我没有复制的代码每一个班级。
-
更新(解决方案选择后):
因此,为了获得,而不是用基类解决这个问题,我定义的功能之一。然后创建新的类,它持有的Singleton实例每层:
public sealed class LogBase
{
private TraceSource logger = null;
public static LogBase GetLogger(string loggerName)
{
return new LogBase(loggerName);
}
private LogBase(string loggerName) { logger = new TraceSource(loggerName); }
public void Error (string text) { logger.WriteError(text); }
public void Info (string text) { logger.WriteInformation(text); }
public void Warning (string text) { logger.WriteWarning(text); }
public void Verbose (string text) { logger.WriteVerbose(text); }
}
// DataAccess logging - no base class
public class DALog
{
private static LogBase logger;
public static LogBase Instance
{
get
{
if (logger==null) { logger = new TraceSource("DataAccess"); }
return logger;
}
}
}
...
我无法将静态方法声明为虚拟。也许我应该返回一个类的实例,然后调用非静态方法来解决这个问题? – 2010-06-18 13:06:15
是的,那样做。你可以使它成为一个单例,并且仍然提供一个静态的方式来访问它:LogBase.GetLogger(“DataAccess”)。然后你几乎看到它在log4net中的样子,你可能想看看它。 – chiccodoro 2010-06-18 13:39:08