2013-07-06 2 views
1

"로그"클래스를 만들고 싶습니다. 주요 사항에 대한 글로벌 로거가있을 것입니다. 그러나 네트워크 부분이 자체 로거에 어떤 것을 기록하기를 원할 때 가능해야합니다. 내 생각 : 로거 클래스의 정적 로거 인스턴스와 같은 이름의 정적 void는 무언가를 기록합니다. 예 :C# : 같은 이름의 일반 및 정적 void

Logger.log("ahaha"); 

메인 로거에 뭔가를 기록하고

new logger().log("kdsjfklsjd"); 

특별한 로거에 기록합니다. 여기 내 클래스의 코드 :

public class Logger 
{ 
    public static Logger GlobalLogger = new Logger(); 

    public Logger() 
    { 
    } 

    public void log(string message) 
    { 
    } 

    public static void log(string message) 
    { 
     Logger.GlobalLogger.log(message); 
    } 
} 

내가

+1

여기 질문은 무엇인가 : 예를 들어, 당신도 Logger 클래스의 정적을 (ILogger를 구현하지 않음)과 별도의 GlobalLogger 클래스를 만드는 고려해 볼 수 있습니다? –

+0

당신의 솔루션은 좋으므로 정확히 원하는 것을 원하십니까? – MEYWD

+1

둘 다 동일한 매개 변수를 갖고 있다면 네가 싱글 톤이 필요합니다. – MEYWD

답변

0

당신이 할 수있는 내가 Logger.GlobalLogger.log (메시지)로 할 때 (같은 이름)을 비 정적 무효를 사용해야하는 코드를 이야기합니다 그걸 아주 좋아해.

  1. 는 다른 매개 변수와 정적 메서드를 정의합니다 :

    public class Logger 
    { 
        public void Log(string message) { ... } 
    
        public static void Log(string message, int level) { ... } 
    } 
    
  2. 'singleton' 패턴을 따라 당신은이 문제를 해결하려면 두 가지 옵션이 있습니다

    Type 'Logger' already defines a member called 'Log' with the same parameter types

    : 당신은 컴파일러 오류가 발생합니다 :

    public class Logger 
    { 
        public void Log(string message) { ... } 
    
        private static Logger globalLogger; 
        public static Logger GlobalLogger 
        { 
         get 
         { 
          if (globalLogger == null) 
          { 
           globalLogger = new Logger(); 
          } 
    
          return globalLogger; 
         } 
        } 
    } 
    
  3. 이 패턴의

    public interface ILogger { 
        void Log(string message); 
    } 
    
    public class Logger : ILogger { 
        public static readonly ILogger GlobalLogger = new Logger(); 
    
        // explicit implementation allows the static and instance Log() to coexist peacefully 
        void ILogger.Log(string message) { /* log */ } 
    
        public static void Log(string message) { GlobalLogger.Log(message); } 
    } 
    

    하나의 좋은 장점은하는 ILogger 인터페이스의 많은 구현을 제공하기 쉽다는 점이다 :이 컴파일러 오류를 해결하기 위해

+0

그건 내가 얻고 싶지 않은 것입니다! 여기 내 코드에서와 같은 문제가 있다고 생각합니다. Logger의 인스턴스에서 무효 로그를 호출하고 정적 void가없는 인스턴스를 직접 호출하려고합니다. –

0

한 가지 방법은 인터페이스를 추가하는 것입니다.

public static class Logger { 
    public static readonly ILogger Global = new GlobalLogger(); 

    public static void Log(string message) { Global.Log(message); } 
} 

public class GlobalLogger : ILogger { 
    void Log(message) { /* log */ } 
} 
+0

보이는 goot, 나는 그것을 시도 할 것이다! –

+0

이 맞습니까? void ILogger.Log (문자열 메시지) {Console.WriteLine ("[INFO]"+ message); Logger.log ("da shit") 호출 후 ; 그것은 아무것도하지 않는다! –

+0

@ danbru1211 : 괜찮아 보입니다. Log() 메서드 내에서 중단 점을 설정하여 호출되는지 확인 했습니까? Console.WriteLine()은 작동하지만 예상 한 곳에 가지 않을 수 있습니다. – ChaseMedallion

관련 문제