提问



如果我从基类继承并希望将继承类的构造函数中的某些东西传递给基类的构造函数,我该怎么做?


例如,


如果我从Exception类继承,我想做这样的事情:


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


基本上我想要的是能够将字符串消息传递给基本的Exception类。

最佳参考


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


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


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

其它参考1


请注意,您可以在对基础构造函数的调用中使用静态方法。


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

其它参考2


如果您需要调用基础构造函数但不是立即调用,因为新(派生)类需要进行一些数据操作,最好的解决方案是采用工厂方法。你需要做的是标记私有你的派生构造函数,然后在你的类中创建一个静态方法,它将执行所有必要的东西,然后调用构造函数并返回对象。


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

其它参考3


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


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

其它参考4


确实使用base(something)来调用基类构造函数,但是在重载的情况下使用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

其它参考5


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


1。自定义异常应具有以异常结尾的名称


    class MyException : Exception


2。例外应该是公开的


    public class MyException : Exception


第3。 CA1032:异常应该实现标准构造函数。 [25]



  • 公共无参数构造函数。

  • 具有一个字符串参数的公共构造函数。

  • 具有一个字符串和Exception的公共构造函数(因为它可以包装另一个Exception)。

  • 序列化构造函数在类型未密封时受到保护,如果类型被密封则为私有。
    基于MSDN:[26]


    [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.
      }
    }  

其它参考6


您还可以在构造函数中使用参数进行条件检查,这允许一些灵活性。


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


要么


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

其它参考7


class Exception
{
     public Exception(string message)
     {
         [...]
     }
}

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

其它参考8


public class MyException : Exception
{
    public MyException() { }
    public MyException(string msg) : base(msg) { }
    public MyException(string msg, Exception inner) : base(msg, inner) { }
}

其它参考9


根据此处列出的其他一些答案,您可以将参数传递给基类构造函数。建议在继承类的构造函数的开头调用基类构造函数。


public class MyException : Exception
{
    public MyException(string message, string extraInfo) : base(message)
    {
        this.Message = $"{message} Extra info: {extraInfo}";
        // You can omit the 'this.' portion above...
    }
}


我注意到在你的例子中你从未使用extraInfo参数,所以我假设你可能想要将extraInfo字符串参数连接到你的异常的Message属性(似乎在接受的答案和问题中的代码中忽略了这一点。


这可以通过调用基类构造函数,然后使用额外信息更新Message属性来实现。


或者,因为Message属性是从基类继承的,所以你甚至不必显式调用基类构造函数。你可以直接从你继承的类的构造函数更新Message属性。 , 喜欢这个:


public class MyException : Exception
{
    public MyException(string message, string extraInfo)
    {
        this.Message = $"{message} Extra info: {extraInfo}";
        // You can omit the 'this.' portion above...
    }
}