实现派生类的TextWriter

D.R*_*.R. 14 c# textwriter

我有两个课程,我不能以任何方式改变:

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

  • @Protectorone:覆盖任何虚拟方法都会提高性能.你是对的,最小的实现 - 只覆盖`Write(char)` - 导致非常慢的打印.但它*有效*,这是一个非常方便的事情. (2认同)