abstract class Car
{
string Name;
//some other fields
abstract public void Details(Stream stream);
}
class Maruti : Car
{
int x;
//some other fields
public override void Details(Stream stream)
{
// to do
}
}
class Mercedes : Car
{
int y;
//some other fields
public override void Details(Stream stream)
{
// to do
}
}
我必须编写 Details 方法,这样如果stream是控制台流,则输出显示在控制台上,如果流是文件流,则输出将写入文件中。
以下是我实现它的方式:
public override void Details(Stream stream)
{
string details = "Name : " + this.Name + Environment.NewLine ;
if (stream is FileStream)
{
TextWriter tmp = Console.Out;
StreamWriter sw2 = new StreamWriter(stream);
Console.SetOut(sw2);
Console.WriteLine(details);
Console.SetOut(tmp);
sw2.Close();
}
else
{
Console.WriteLine(details);
}
}
我在我的派生类中使用了上述方法并进行了一些修改。还有更好的方法吗?
答案 0 :(得分:2)
你应该可以用{:}替换整个Details
。{/ p>
string details = "Name : " + this.Name;
StreamWriter sw = new StreamWriter(stream);
sw.WriteLine(details);
sw.WriteLine();
根据您是否希望在将details
字符串写入后继续使用传递的流,您可能还想添加命令:
sw.Close();
说明:StreamWriter
来自TextWriter
...而Console.Out
的类型为TextWriter
。因此,您不必使用临时流编写器替换控制台输出,但可以直接使用它来编写您的内容。
另请注意,当您将Environment.NewLine
添加到details
字符串时,您应该依赖于流自己的换行符,该换行符可能与环境字符不同。如果你真的想要两个换行符,你应该拨打两个WriteLine
来电,如上例所示。
答案 1 :(得分:1)
这似乎非常错误。
如果要写入控制台,只需将Details()
从Console.Out
返回的流传递给Details()
,然后始终在myCar.Details(Console.Out);
的实现中写入流。< / p>
所以你可以这样称呼它:
{{1}}