如果我从基类继承,并想将继承类的构造函数传递给基类的构造函数,我该怎么做?

例如,如果我从Exception类继承,我希望执行以下操作:

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

基本上,我希望能够将字符串消息传递给基础Exception类。


当前回答

来自框架设计指南和FxCop规则。:

1.自定义异常的名称应以异常结尾

    class MyException : Exception

2.异常应为公共

    public class MyException : Exception

3.CA1032:异常应实现标准构造函数。

公共无参数构造函数。具有一个字符串参数的公共构造函数。具有一个字符串和异常的公共构造函数(因为它可以包装另一个异常)。如果类型未密封,则受保护的序列化构造函数;如果类型已密封,则为私有构造函数。基于MSDN:[可串行化()]公共类MyException:异常{公共MyException(){//添加任何类型特定的逻辑,并提供默认消息。}公共MyException(字符串消息):基本(消息){//添加任何类型特定的逻辑。}公共MyException(字符串消息,异常innerException):基本(消息,内部异常){//为内部异常添加任何特定于类型的逻辑。}受保护的MyException(SerializationInfo信息,StreamingContext上下文):基本(信息,上下文){//实现特定于类型的序列化构造函数逻辑。}}

or

    [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 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);
    }
}

将构造函数修改为以下值,以便正确调用基类构造函数:

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

请注意,构造函数不是可以在方法中随时调用的。这就是在构造函数主体中调用时出错的原因。

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

可以将内部异常传递给其中一个构造函数。

来自框架设计指南和FxCop规则。:

1.自定义异常的名称应以异常结尾

    class MyException : Exception

2.异常应为公共

    public class MyException : Exception

3.CA1032:异常应实现标准构造函数。

公共无参数构造函数。具有一个字符串参数的公共构造函数。具有一个字符串和异常的公共构造函数(因为它可以包装另一个异常)。如果类型未密封,则受保护的序列化构造函数;如果类型已密封,则为私有构造函数。基于MSDN:[可串行化()]公共类MyException:异常{公共MyException(){//添加任何类型特定的逻辑,并提供默认消息。}公共MyException(字符串消息):基本(消息){//添加任何类型特定的逻辑。}公共MyException(字符串消息,异常innerException):基本(消息,内部异常){//为内部异常添加任何特定于类型的逻辑。}受保护的MyException(SerializationInfo信息,StreamingContext上下文):基本(信息,上下文){//实现特定于类型的序列化构造函数逻辑。}}

or

    [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())
{
}

or

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