문제

면 기본 클래스에서 상속하고 전달하려면에서 무언가를 생성자의 상속받은 클래스를 생성자의 기본 클래스가 어떻게 할까요?

예를 들어,

면에서 상속 예외 클래스고 싶은 다음과 같은 것이 가능합니다.

class MyExceptionClass : Exception
{
     public MyExceptionClass(string message, string extraInfo)
     {
         //This is where it's all falling apart
         base(message);
     }
}

기본적으로 내가 원하는 것은 전달할 수 있도록 하는 문자열은 메시지 기본 제외 클래스입니다.

도움이 되었습니까?

해결책

수정 생성자를 다음을 호출하여 기본 클래스에 제대로 생성자:

public class MyExceptionClass : Exception
{
    public MyExceptionClass(string message, string extrainfo) : base(message)
    {
        //other stuff here
    }
}

참고로 생성되지 않은 뭔가를 호출할 수 있는 언제든지 내 방법입니다.그 이유는 당신의 오류에 당신의 통화에서 생성자체.

다른 팁

참고하는 데 사용할 수 있는 static 방법 내에서 호출하여 기본 생성자입니다.

class MyExceptionClass : Exception
{
     public MyExceptionClass(string message, string extraInfo) : 
         base(ModifyMessage(message, extraInfo))
     {
     }

     private static string ModifyMessage(string message, string extraInfo)
     {
         Trace.WriteLine("message was " + message);
         return message.ToLowerInvariant() + Environment.NewLine + extraInfo;
     }
}

를 호출해야 하는 경우에는 기본 생성자를 그러나지 않기 때문에 바로 새로운(유래)등 필요한 데이터를 조작,최고의 솔루션 리조트 공장 방법입니다.당신이해야 할 무엇을 표시하는 것입니다 프라이빗 파생 생성자를,다음 정 클래스의 메소드 수행하는 데 필요한 모든 재료하고 나중에 생성자를 호출하고 반환한다.

public class MyClass : BaseClass
{
    private MyClass(string someString) : base(someString)
    {
        //your code goes in here
    }

    public static MyClass FactoryMethod(string someString)
    {
        //whatever you want to do with your string before passing it in
        return new MyClass(someString);
    }
}

그것은 진정한 사용 base (뭔가)를 기본 클래스 생성자를 호출하지만,경우에는 과부하 사용 this 키워드

public ClassName() : this(par1,par2)
{
// do not call the constructor it is called in the this.
// the base key- word is used to call a inherited constructor   
} 

// Hint used overload as often as needed do not write the same code 2 or more times
public class MyExceptionClass : Exception
{
    public MyExceptionClass(string message,
      Exception innerException): base(message, innerException)
    {
        //other stuff here
    }
}

전달할 수 있습니다 내면의 예외 중 하나로 생성자입니다.

Design Guidelines 고 FxCop 규칙이 있습니다.:

1.사용자 지정 예외가 있어야 이름으로 끝나는 예외

    class MyException : Exception

2.예외를 공개

    public class MyException : Exception

3. CA1032:예외를 구현하는 표준이 생성자입니다.

  • 공공턴 생성자입니다.
  • Public 생성자나 문자열이다.
  • Public 생성자나 문자열을 제외(수 있는 포장 또 다른 예외).
  • Serialization 생성자를 보호가 없는 경우는 밀폐 및 개인하는 경우 형식이 밀봉된다.에 따라 MSDN:

    [Serializable()]
    public class MyException : Exception
    {
      public MyException()
      {
         // Add any type-specific logic, and supply the default message.
      }
    
      public MyException(string message): base(message) 
      {
         // Add any type-specific logic.
      }
      public MyException(string message, Exception innerException): 
         base (message, innerException)
      {
         // Add any type-specific logic for inner exceptions.
      }
      protected MyException(SerializationInfo info, 
         StreamingContext context) : base(info, context)
      {
         // Implement type-specific serialization constructor logic.
      }
    }  
    

    [Serializable()]
    public sealed class MyException : Exception
    {
      public MyException()
      {
         // Add any type-specific logic, and supply the default message.
      }

      public MyException(string message): base(message) 
      {
         // Add any type-specific logic.
      }
      public MyException(string message, Exception innerException): 
         base (message, innerException)
      {
         // Add any type-specific logic for inner exceptions.
      }
      private MyException(SerializationInfo info, 
         StreamingContext context) : base(info, context)
      {
         // Implement type-specific serialization constructor logic.
      }
    }  

할 수도 있습니다 하는 조건부 확인 매개변수에서 생성할 수 있는 유연성.

public MyClass(object myObject=null): base(myObject ?? new myOtherObject())
{
}

public MyClass(object myObject=null): base(myObject==null ? new myOtherObject(): myObject)
{
}
class Exception
{
     public Exception(string message)
     {
         [...]
     }
}

class MyExceptionClass : Exception
{
     public MyExceptionClass(string message, string extraInfo)
     : base(message)
     {
         [...]
     }
}
public class MyException : Exception
{
    public MyException() { }
    public MyException(string msg) : base(msg) { }
    public MyException(string msg, Exception inner) : base(msg, inner) { }
}

따라의 일부 다른 답변 여기에 나열되어,전달할 수 있습니다 매개변수로 기본 클래스 생성자입니다.그것은 권고 전화하는 기본 클래스 생성자의 시작 부분에서 생성자를 위한 상속된 클래스입니다.

public class MyException : Exception
{
    public MyException(string message, string extraInfo) : base(message)
    {
    }
}

나는 당신의 예를 만든 적용 extraInfo 매개변수,그래서 가정할 수 있습을 연결 extraInfo 문자열을 매개 변수 Message 시설의 예외는(그것이 무서 허용되는 답변 및 코드에 당신의 질문에).

이것은 단순히 달성을 호출하여 기본 클래스 생성자 및 그 후 업데이트 메시지의 속성을 추가 정보입니다.

public class MyException: Exception
{
    public MyException(string message, string extraInfo) : base($"{message} Extra info: {extraInfo}")
    {
    }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top