2010-12-22 2 views
3

문자열 인수를 취할 메서드 오버로드를 만들려고합니다. 내 의도는 기본적으로 내가 자신을 Console.ReadLine를 오버로드 할 수 있습니다 생각하지 않는다Console.ReadLine 오버로드가 가능합니까? (또는 임의의 정적 클래스 메서드)

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

대신에

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

을 쓸 수 있도록, 그래서 다음과 같이 상속 된 클래스를 구현하려고 :

public static class MyConsole : System.Console 
{ 
    public static string ReadLine(string s) 
    { 
     Write(s); 
     return ReadLine(); 
    } 
} 
자동적으로하게 정적 클래스이기 때문에 ( System.Console에서 상속 할 수 없습니다 원인,하지만 작동하지 않습니다

봉인 된 클래스).

여기서 내가하려고하는 것이 의미가 있습니까? 아니면 정적 클래스에서 무언가를 오버로드하고 싶지 않은가요?

+1

당신이 방금 콘솔에서 작동 자신의 정적 클래스를 만들 수 없습니다 :

예 (우리가 할당 독자와 작가로, 위의 내 두 번째 샘플에있는 가정)? –

답변

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을하고자하는 경우 좀 더 유연하게, 당신은 또한 입력/출력 구현을 대체하기 위해 지원을 추가 할 수 있습니다 : 이것은 당신이 어떤 TextReader implemen에서 프로그램을 구동 할 수있는 것

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 
} 

명령이 멋진 자동화 시나리오를 제공 할 수 대신 콘솔의 파일, ...

업데이트에서 올 수 있도록 tation는
이 노출해야하는 대부분의 방법은 매우 간단합니다. 좋아, 아마 쓰는 것이 약간 지루하지만 일의 많은 분이 아니기 때문에 한 번만해야합니다.

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

그런 식으로하면, 나는'ReadlLine()'에'MyConsole'을 사용하는 것을 잊지 않고, 다른 Console 메쏘드에는'Console'을 사용해야합니다. 상속이 가능하다면 MyConsole.WriteLine(), MyConsole.Clear() 또는 다른 Console 메서드를 사용할 수 있습니다. – comecme

+1

@comecme : 사용하고자하는 모든 메소드를 랩핑하기 위해 (일반적으로 그다지 많지 않은) MyConsole을 사용하는 것이 좋습니다. –

+0

자신의 클래스에서 Console의 모든 메소드를 래핑하여 동일한 넷 효과를 얻을 수 있습니다. –

관련 문제