Перегрузка Console.ReadLine возможна?(или любой метод статического класса) - PullRequest
3 голосов
/ 22 декабря 2010

Я пытаюсь создать перегрузку метода 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 (потому что это статический класс, который автоматически делает запечатанным класс).

Имеет ли смысл то, что я пытаюсь сделать здесь? Или никогда не стоит перегружать что-либо из статического класса?

1 Ответ

6 голосов
/ 22 декабря 2010

Просто оберните консоль в свой собственный класс и используйте ее вместо этого.Вам не нужно наследовать для этого:

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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...