我有两个课程,我不能以任何方式改变:
第1类:将a TextWriter作为构造函数参数并将其用作输出流.
第2类:提供方法WriteLine(string).
我需要一个适配器,这样Class1的所有输出都写入Class2.因此,我启动了一个适配器,它扩展TextWriter并缓冲传入的文本,并在新行到达时将其刷新到class2实例.
但是,TextWriter中有很多方法 - 我应该实现哪些方法?Class1中的输出仅为字符串.
根据MSDN,应该至少覆盖Write(char),但是,这强制我自己完成所有\ r \n新行处理...
Q1:你知道更好的方法来实现我的目标吗?Q2:如果不是,我应该覆盖哪些TextWriter方法以实现最小的实现工作.
Jim*_*hel 17
实现Write(char)你的TextWriter派生类是所有你需要做的.如果有人调用WriteLine您的新类,WriteLine则调用基类方法.它会做正确的事:Write用个人\r和\n角色调用你的方法.
实际上,WriteLine(string)看起来像这样:
void WriteLine(string s)
{
Write(s);
Write("\r\n");
}
Run Code Online (Sandbox Code Playgroud)
而Write(string)实际上是:
foreach (char c in s)
{
Write(c);
}
Run Code Online (Sandbox Code Playgroud)
解决循环中调用的所有Write方法.TextWriterWrite(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; }
}
}
Run Code Online (Sandbox Code Playgroud)
如果我然后写:
using (var myWriter = new ConsoleTextWriter())
{
myWriter.Write("hello, world");
myWriter.WriteLine();
myWriter.WriteLine();
myWriter.WriteLine("Goodbye cruel world.");
myWriter.Write("Fee fie foe foo!");
}
Run Code Online (Sandbox Code Playgroud)
输出是:
hello, world
Goodbye cruel world.
Fee fie foe foo!
Run Code Online (Sandbox Code Playgroud)