我有两个类,任何一个都不能以任何方式更改:

第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/

10-10 07:49