我正在尝试创建一个带有字符串参数的System.Console.ReadLine()
方法的重载。我的意图基本上是能够写
string s = Console.ReadLine("Please enter a number: ");
代替
Console.Write("Please enter a number: ");
string s = Console.ReadLine();
我认为不可能重载Console.ReadLine
本身,所以我尝试实现一个继承的类,如下所示:
public static class MyConsole : System.Console
{
public static string ReadLine(string s)
{
Write(s);
return ReadLine();
}
}
但这不起作用,因为无法从System.Console
继承(因为它是一个静态类,它自动生成一个密封的类)。
我在这里尝试做什么才有意义?或者想要从静态类中重载某些东西永远不是一个好主意?
答案 0 :(得分:6)
只需将控制台包装在您自己的类中,然后使用它。你不需要为此继承:
class MyConsole
{
public static string ReadLine()
{
return System.Console.ReadLine();
}
public static string ReadLine(string message)
{
System.Console.WriteLine(message);
return ReadLine();
}
// add whatever other methods you need
}
然后你可以继续在你的程序中使用那个:
string whatEver = MyConsole.ReadLine("Type something useful:");
如果您希望进一步推动它并使MyConsole
更灵活一些,您还可以添加支持来替换输入/输出实现:
class MyConsole
{
private static TextReader reader = System.Console.In;
private static TextWriter writer = System.Console.Out;
public static void SetReader(TextReader reader)
{
if (reader == null)
{
throw new ArgumentNullException("reader");
}
MyConsole.reader = reader;
}
public static void SetWriter(TextWriter writer)
{
if (writer == null)
{
throw new ArgumentNullException("writer");
}
MyConsole.writer = writer;
}
public static string ReadLine()
{
return reader.ReadLine();
}
public static string ReadLine(string message)
{
writer.WriteLine(message);
return ReadLine();
}
// and so on
}
这将允许您从任何TextReader
实现驱动程序,因此命令可以来自文件而不是控制台,这可以提供一些不错的自动化方案......
<强>更新强>
您需要公开的大多数方法都非常简单。好吧,或许写起来有点乏味,但这不是很多分钟的工作,你只需要做一次。
示例(假设我们在上面的第二个示例中,具有可分配的读者和编写者):
public static void WriteLine()
{
writer.WriteLine();
}
public static void WriteLine(string text)
{
writer.WriteLine(text);
}
public static void WriteLine(string format, params object args)
{
writer.WriteLine(format, args);
}