C# 是否可能重载Console.ReadLine?(或任何静态类方法)
我试图创建一个重载的C# 是否可能重载Console.ReadLine?(或任何静态类方法),c#,class,static,console,overloading,C#,Class,Static,Console,Overloading,我试图创建一个重载的System.Console.ReadLine()方法,该方法将接受一个字符串参数。我的目的基本上是能够写作 string s = Console.ReadLine("Please enter a number: "); 代替 Console.Write("Please enter a number: "); string s = Console.ReadLine(); 我认为不可能重载Console.ReadLine本身,所以我尝试实现一个继承类,如下所示: publi
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
继承(因为它是一个静态类,会自动使其成为密封类)
我在这里做的有意义吗?或者,想要从静态类重载某些内容从来都不是一个好主意吗?只需将控制台包装在您自己的类中,然后使用它即可。您不需要为此继承:
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
实现驱动程序,因此命令可以来自文件而不是控制台,这可以提供一些很好的自动化场景
更新您需要公开的大多数方法都非常简单。好吧,也许写起来有点乏味,但它不需要很多分钟的工作,而且你只需要写一次 示例(假设我们在上面的第二个示例中,具有可分配的读写器):
您是否可以创建自己的仅在控制台上工作的静态类?如果这样做,我必须记住对
ReadlLine()
使用MyConsole
,但对任何其他控制台方法使用Console
。如果可以继承,我可以使用MyConsole.WriteLine()
、MyConsole.Clear()
或任何其他控制台
方法。@comecme:想法是让MyConsole
包装所有需要使用的方法(通常不太多)。您可以在自己的类中包装控制台的每个方法,并实现相同的净效果。@Fredrik:如果我想将Write
和WriteLine
方法包装到MyConsole中,我必须包装我想使用的每个Write和WriteLine重载,对吗?所以,也许方法不是那么多,但有很多重载。@comecme:事实上更容易;您要使用的大多数方法都直接映射到在底层TextWriter
或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);
}