2010-12-22 5 views
3

Ich versuche, eine Überladung der System.Console.ReadLine() Methode zu verursachen, die ein Schnurargument nimmt. Meine Absicht ist es grundsätzlich in der Lage seinÜberladen der Console.ReadLine möglich? (oder irgendeine statische Klassenmethode)

string s = Console.ReadLine("Please enter a number: "); 

anstelle von

Console.Write("Please enter a number: "); 
string s = Console.ReadLine(); 

zu schreiben Ich glaube nicht, es möglich ist, Console.ReadLine selbst zu überlasten, so habe ich versucht, eine vererbte Klasse Umsetzung wie folgt aus:

public static class MyConsole : System.Console 
{ 
    public static string ReadLine(string s) 
    { 
     Write(s); 
     return ReadLine(); 
    } 
} 

das ist nicht, obwohl nicht funktioniert, weil es nicht möglich ist, von System.Console zu erben (weil es eine statische Klasse, die automatisch macht eine versiegelte Klasse).

Macht es Sinn, was ich hier versuche? Oder ist es nie eine gute Idee, etwas aus einer statischen Klasse zu überladen?

+1

Können Sie nicht nur Ihre eigene statische Klasse, die auf der Konsole funktioniert? –

Antwort

6

Packen Sie die Konsole einfach in Ihre eigene Klasse und verwenden Sie sie stattdessen. Sie müssen nicht für das erben:

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 
} 

Dann können Sie voran gehen und dass man in Ihrem Programm verwenden statt:

string whatEver = MyConsole.ReadLine("Type something useful:"); 

Wenn Sie möchten, um es schieben ein bisschen weiter und machen MyConsole ein bisschen flexibler, können Sie auch Unterstützung fügen Sie die Eingabe/Ausgabe-Implementierungen zu ersetzen:

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 
} 

Dieses Sie das Programm von jedem TextReader Umset zu fahren erlauben würde, tation, so Befehle aus einer Datei statt der Konsole kommen könnte, die Szenarien ein paar schöne Automatisierung bieten könnte ...

aktualisieren
Die meisten Methoden, die Sie brauchen, um aussetzen extrem einfach. OK, ein bisschen langweilig, vielleicht zu schreiben, aber es sind nicht viele Minuten Arbeit, und Sie müssen es nur einmal tun.

Beispiel (unter der Annahme, wir in meiner zweiten Probe sind oben, mit zuweisbaren Leser und Autor):

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); 
} 
+0

Wenn ich es so mache, muss ich daran denken, 'MyConsole' für' ReadlLine() 'zu verwenden, aber' Console' für jede andere Console-Methode. Wenn eine Vererbung möglich wäre, könnte ich einfach 'MyConsole.WriteLine()', 'MyConsole.Clear()' oder eine andere 'Console'-Methode verwenden. – comecme

+1

@comecme: Die Idee wäre, 'MyConsole' zu ​​haben, um alle Methoden, die Sie verwenden müssten (die normalerweise nicht so viele sind), zu umbrechen. –

+0

Sie können jede Console-Methode in Ihre eigene Klasse einbinden und denselben Nettoeffekt erzielen. –

Verwandte Themen