我有两个类,任何一个都不能以任何方式更改:
第1类:将TextWriter
作为构造函数参数,并将其用作输出流。
第2类:提供一种WriteLine(string)
方法。
我需要一个适配器,以便将Class1的所有输出写入Class2。因此,我启动了一个适配器,该适配器扩展了TextWriter
并缓冲传入的文本,并在新行到达时立即将其刷新到class2实例。
但是,TextWriter中有许多方法-我应该实现哪些方法? Class1中的输出仅是字符串。
根据MSDN,应该至少重写Write(char),但这迫使我也要执行所有\r\n新行来处理自己。
问题1:您知道实现我的目标的更好方法吗?
Q2:如果没有,我应该重写哪些TextWriter方法以最小化实现工作。
最佳答案
您只需要做在Write(char)
派生类上实现TextWriter
。如果有人在您的新类上调用WriteLine
,则将调用基类WriteLine
方法。它将做正确的事情:使用各个Write
和\r
字符调用\n
方法。
实际上,WriteLine(string)
看起来像这样:
void WriteLine(string s)
{
Write(s);
Write("\r\n");
}
Write(string)
实际上是:foreach (char c in s)
{
Write(c);
}
Write
中的所有TextWriter
方法都可以解析为可在循环中调用Write(char)
的东西。您真的不需要执行其他任何操作。只需覆盖
Write(char)
并将其插入即可。它将起作用。您可以覆盖其他方法。这样做将使您的类更有效率(更快)。但这不是必需的。我说您可以做的最简单的事情。然后,如果在分析后确定您的自定义编写器太慢,请根据需要重写其他方法。
这是最小的
TextWriter
后代:public class ConsoleTextWriter: TextWriter
{
public override void Write(char value)
{
Console.Write(value);
}
public override Encoding Encoding
{
get { return Encoding.Default; }
}
}
如果我再写:
using (var myWriter = new ConsoleTextWriter())
{
myWriter.Write("hello, world");
myWriter.WriteLine();
myWriter.WriteLine();
myWriter.WriteLine("Goodbye cruel world.");
myWriter.Write("Fee fie foe foo!");
}
输出为:
hello, world
Goodbye cruel world.
Fee fie foe foo!
关于c# - 实现派生的TextWriter类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17712607/